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); }
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"; }
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"; }
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!