Maison > développement back-end > C++ > En quoi le comportement de SFINAE diffère-t-il entre les types de retour et les paramètres de modèle dans les surcharges de fonctions C ?

En quoi le comportement de SFINAE diffère-t-il entre les types de retour et les paramètres de modèle dans les surcharges de fonctions C ?

Linda Hamilton
Libérer: 2024-12-27 04:43:51
original
631 Les gens l'ont consulté

How Does SFINAE Behavior Differ Between Return Types and Template Parameters in C   Function Overloads?

Variance du comportement SFINAE dans les types de retour par rapport aux paramètres du modèle

En C, l'idiome SFINAE (Substitute Failure Is Not an Error) autorise le conditionnel surcharges de fonctions basées sur la métaprogrammation de modèles et les traits de type. Cependant, il existe des cas où SFINAE se comporte différemment selon son emplacement dans la déclaration du modèle de fonction.

Considérez le code suivant :

template<typename T,
         typename = typename std::enable_if<
                        std::is_integral<T>::value>::type>
void foo(T);  // Incorrect placement, triggers error

template<typename T,
         typename = typename std::enable_if<
                        std::is_floating_point<T>::value>::type>
void foo(T);  // Incorrect placement, triggers error

template<typename T>
void foo(T)    // Correct placement
    -> typename std::enable_if<
            std::is_integral<T>::value>::type;

template<typename T>
void foo(T)    // Correct placement
    -> typename std::enable_if<
            std::is_floating_point<T>::value>::type;
Copier après la connexion

Dans le premier ensemble de surcharges (placement incorrect), placer SFINAE dans les paramètres du modèle plutôt que dans le type de retour entraîne une erreur de compilation. En effet, les arguments du modèle par défaut (dans ce cas, le suffixe ::type) ne sont pas pris en compte pour déterminer l'équivalence de surcharge. Par conséquent, le compilateur traite les fonctions comme des déclarations en double avec la même signature.

Cependant, dans le deuxième ensemble de surcharges (placement correct), SFINAE est appliqué au type de retour, ce qui implique une métaprogrammation de modèle. Ce placement garantit que l'expression faisant référence aux paramètres du modèle fait partie de la signature de la fonction. De ce fait, le compilateur reconnaît les surcharges comme des entités distinctes, permettant à SFINAE de fonctionner correctement.

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