Maison > développement back-end > C++ > Comment fonctionne l'expression SFINAE (Substitution Failure Is Not An Error) en C et comment peut-elle être utilisée pour définir des traits et appliquer conditionnellement des surcharges de fonctions ?

Comment fonctionne l'expression SFINAE (Substitution Failure Is Not An Error) en C et comment peut-elle être utilisée pour définir des traits et appliquer conditionnellement des surcharges de fonctions ?

DDD
Libérer: 2024-11-11 04:49:03
original
679 Les gens l'ont consulté

How does Expression SFINAE (Substitution Failure Is Not An Error) work in C   and how can it be used to define traits and conditionally apply function overloads?

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) {}
Copier après la connexion

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
Copier après la connexion

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)) {};
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal