Maison > développement back-end > C++ > Pourquoi SFINAE échoue-t-il dans les types de retour mais réussit-il avec les paramètres de modèle ?

Pourquoi SFINAE échoue-t-il dans les types de retour mais réussit-il avec les paramètres de modèle ?

Mary-Kate Olsen
Libérer: 2024-12-13 07:27:10
original
984 Les gens l'ont consulté

Why Does SFINAE Fail in Return Types but Succeed with Template Parameters?

SFINAE dans les types de retour et les paramètres de modèle

Supposons que nous ayons un modèle de fonction foo qui fait la distinction entre les nombres entiers et les nombres à virgule flottante :

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

Cependant, ce code échoue avec une erreur lorsqu'il est appelé avec un double value :

foo(3.4);
// Error: no matching function for call to 'foo(double)'
Copier après la connexion

Pourquoi cette approche échoue-t-elle ?

Dans ce cas, SFINAE est utilisé pour définir conditionnellement le type de retour de foo. Cependant, cela viole les règles de surcharge des modèles de fonctions, qui ne prennent pas en compte les arguments de modèle par défaut. Par conséquent, le compilateur traite les deux modèles foo comme la même fonction avec la même signature.

Approche alternative utilisant les paramètres du modèle de référence d'expression

Pour résoudre ce problème, nous pouvons à la place utiliser l'expression faisant référence aux paramètres du modèle 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

Avec cette modification, l'expression std::enable_if devient une partie du signature de fonction, permettant à SFINAE de différencier les deux modèles foo.

Par conséquent, la deuxième version de foo fonctionne correctement, tandis que la première version déclenche une erreur.

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