Maison > développement back-end > C++ > SFINAE en C : paramètre de modèle et type de retour – Quelle est la différence ?

SFINAE en C : paramètre de modèle et type de retour – Quelle est la différence ?

Mary-Kate Olsen
Libérer: 2024-12-14 05:53:17
original
1000 Les gens l'ont consulté

SFINAE in C  : Template Parameter vs. Return Type – What's the Difference?

SFINAE dans le type de retour par rapport au paramètre de modèle : une comparaison

En C, l'idiome SFINAE (Substitution Failure Is Not An Error) autorise le conditionnel compilation basée sur la disponibilité des types. Cependant, son comportement peut varier lorsqu'il est placé à différentes positions dans un modèle.

SFINAE dans le paramètre de modèle

Dans le code ci-dessous, SFINAE est utilisé comme paramètre de modèle pour activer ou désactiver une surcharge de fonction de modèle particulière.

template<typename T,
         typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T) -> void { /* ... */ }

template<typename T,
         typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T) -> void { /* ... */ }
Copier après la connexion

Dans ce cas, SFINAE est appliqué au deuxième paramètre de modèle, qui est en fait un espace réservé. L'erreur se produit lors de la tentative d'appel de foo(3.4) car la deuxième déclaration de fonction de modèle avec std::enable_if::value> n'est pas défini, ce qui entraîne une surcharge manquante.

SFINAE dans le type de retour

En revanche, le code suivant utilise SFINAE dans le type de retour :

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_integral<T>::value>::type { /* ... */ }

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_floating_point<T>::value>::type { /* ... */ }
Copier après la connexion

Dans ce cas, SFINAE est appliqué au type de retour, ce qui permet au compilateur de différencier les deux fonctions de modèle en fonction de l'argument fourni. tapez.

Pourquoi la différence ?

La différence de comportement provient de l'utilisation d'arguments de modèle par défaut. Dans le premier exemple, le deuxième paramètre du modèle est par défaut typename std::enable_if::value>::type, ce qui rend les déclarations de fonction du modèle équivalentes.

Cependant, dans dans le deuxième exemple, le type de retour utilise SFINAE dans une expression, qui fait partie de la signature de la fonction. Cela garantit que les fonctions du modèle ont des signatures différentes et permet à SFINAE de fonctionner comme prévu.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal