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 { /* ... */ }
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
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 { /* ... */ }
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
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!