Maison >développement back-end >C++ >Comment SFINAE peut-il être utilisé efficacement avec les fonctions membres des modèles de classe ?
SFINAE pour les fonctions membres des modèles de classe
Dans le code fourni, SFINAE est appliqué aux fonctions membres d'un modèle de classe. Cependant, cette approche rencontre une erreur car SFINAE n'est applicable qu'aux arguments de modèle déduits, spécifiquement pour les modèles de fonctions.
Dans ce cas, la classe Foo est un modèle, mais les deux fonctions membres bar() sont instanciées inconditionnellement indépendamment du paramètre de modèle T. Cela conduit à l'erreur de compilation indiquant que les deux surcharges ne peuvent pas être valides toutes les deux.
Pour résoudre ce problème, SFINAE peut être utilisé correctement en déduisant les arguments du modèle pour les fonctions membres. Les modifications suivantes peuvent être apportées :
<code class="cpp">#include <type_traits> struct A{}; struct B{}; template <typename T> struct Foo { template <typename U = T> // Deduce the template argument typename std::enable_if<std::is_same<U, A>::value>::type bar() {} template <typename U = T> // Deduce the template argument typename std::enable_if<std::is_same<U, B>::value>::type bar() {} };</code>
En déduisant les arguments de modèle pour les fonctions membres, SFINAE peut désormais déterminer quelle surcharge de bar() instancier en fonction de l'argument de modèle réel fourni pour Foo. Cette approche garantit que le code sera compilé avec succès et se comportera 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!