Sobes.tech
Junior — Middle

Comment peut-on imposer des contraintes sur les types dans les paramètres de modèle en C++?

sobes.tech IA

Réponse de l'IA

En C++, les restrictions sur les types dans les paramètres de modèles peuvent être définies de plusieurs manières:

  1. SFINAE (Substitution Failure Is Not An Error) — en utilisant std::enable_if et d'autres méta-fonctions de <type_traits>, on peut inclure ou exclure des fonctions ou classes modèles en fonction des propriétés des types.
#include <type_traits>

template<typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
void foo(T value) {
    // Implémentation pour les types entiers
}

int main() {
    foo(10);    // OK, int est entier
    // foo(3.14); // Erreur de compilation, double ne convient pas
}
  1. Concepts — à partir de C++20, on peut utiliser des concepts pour des restrictions de types plus lisibles et déclaratives.
#include <concepts>

template<std::integral T>
void foo(T value) {
    // Implémentation pour les types entiers
}
  1. Assertions statiques (static_assert) — à l'intérieur d'un modèle, on peut vérifier les propriétés du type et générer une erreur de compilation avec un message.
#include <type_traits>

template<typename T>
void foo(T value) {
    static_assert(std::is_integral_v<T>, "T doit être un type entier");
    // ...
}

Ainsi, les restrictions aident à rendre les modèles plus sûrs et plus compréhensibles.