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:
- SFINAE (Substitution Failure Is Not An Error) — en utilisant
std::enable_ifet 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
}
- 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
}
- 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.