Maison >développement back-end >C++ >SFINAE en C : type de retour par rapport au type de paramètre pour la spécialisation de modèle conditionnel ?

SFINAE en C : type de retour par rapport au type de paramètre pour la spécialisation de modèle conditionnel ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-13 02:33:13683parcourir

SFINAE in C  : Return Type vs. Parameter Type for Conditional Template Specialization?

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

Description du problème

En C, SFINAE (l'échec de substitution n'est pas une erreur) peut être utilisé pour activer ou désactiver sous condition les spécialisations de modèles en fonction des traits de type. Cependant, un problème courant survient lorsque SFINAE est appliqué différemment dans les types de retour de modèle et les paramètres de modèle.

Considérez la fonction principale suivante :

int main()
{
    foo(5);
    foo(3.4);
}

Implémentation défectueuse à l'aide de SFINAE dans les paramètres de modèle

Lorsque SFINAE est placé dans les paramètres du modèle, comme indiqué ci-dessous, il ne parvient pas à se compiler avec un erreur :

template<typename T,
         typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T) -> void
{
    std::cout << "I'm an integrer!\n";
}

template<typename T,
         typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T) -> void
{
    std::cout << "I'm a floating point number!\n";
}

Implémentation correcte à l'aide de SFINAE dans les types de retour

Cette implémentation fonctionne cependant correctement :

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_integral<T>::value>::type
{
    std::cout << "I'm an integrer!\n";
}

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_floating_point<T>::value>::type
{
    std::cout << "I'm a floating point number!\n";
}

Explication

La différence réside dans la manière dont la surcharge des modèles de fonctions est définie dans le standard C (14.5.6.1). Les modèles surchargés sont équivalents s'ils ont le même nom de fonction, le même nombre de paramètres et les mêmes types de paramètres. Cependant, les arguments de modèle par défaut ne sont pas pris en compte dans cette comparaison.

Dans l'implémentation défectueuse, la condition SFINAE est incluse comme argument de modèle par défaut, ce qui donne lieu à deux modèles de fonctions identiques définis deux fois. Cela déclenche l'erreur de compilation.

Dans l'implémentation correcte, la condition SFINAE est utilisée dans le cadre du type de retour du modèle. Puisqu'il s'agit d'expressions faisant référence à des paramètres de modèle, les deux fonctions ont des signatures différentes et permettent ainsi à 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!

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