Comprendre l'expression SFINAE
Dans le contexte de la programmation C, l'expression SFINAE (Substitution Failure Is Not An Error) permet d'appliquer conditionnellement une fonction surcharges basées sur la validité d'une expression dans la déclaration de fonction.
Expression SFINAE dans Action
Considérez les exemples de code suivants :
Exemple 1 :
template <int I> struct A {}; char xxx(int); char xxx(float); template <class T> A<sizeof(xxx((T)0))> f(T) {}
La fonction f() renvoie une structure A avec un paramètre que j'ai défini sur la taille du résultat de l'appel de xxx() avec la valeur convertie du paramètre de modèle T en (T)0.
Exemple 2 :
struct X {}; struct Y { Y(X) {} }; template <class T> auto f(T t1, T t2) -> decltype(t1 + t2); // #1 X f(Y, Y); // #2 X x1, x2; X x3 = f(x1, x2); // deduction fails on #1 (cannot add X+X), calls #2
Dans l'exemple 2, les surcharges de fonction f() permettent à la fois l'ajout de types numériques (#1) et construction de Y à partir de X (#2). Lorsque la fonction f() est appelée avec x1 et x2 (qui sont des objets X), la surcharge qui construit Y est sélectionnée car la première surcharge n'est pas valide pour les objets X.
Cas d'utilisation courant : trait Définition
L'expression SFINAE est couramment utilisée dans la définition de traits, où elle vous permet de définir des traits basés sur l'existence de fonctions membres spécifiques dans une classe. Par exemple :
struct has_member_begin_test { template <class U> static auto test(U* p) -> decltype(p->begin(), std::true_type()); template <class> static auto test(...) -> std::false_type; }; template <class T> struct has_member_begin : decltype(has_member_begin_test::test<T>(0)) {};
Le modèle de structure has_member_begin peut être utilisé pour vérifier si une classe a une fonction membre start(). Il utilise l'expression SFINAE pour déterminer si l'expression start() renvoie un type ou une expression valide, et renvoie std::true_type si valide, sinon std::false_type.
Remarque importante :
L'expression SFINAE est un ajout relativement récent au langage C, et tous les compilateurs ne le prennent pas entièrement en charge. Si vous rencontrez des problèmes avec l'expression SFINAE dans votre code, il est important de vérifier que la version de votre compilateur la prend en charge.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!