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
Mary-Kate Olsenoriginal
2024-12-13 07:27:10981parcourir

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;

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)'

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;

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!

Déclaration:
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