Maison >développement back-end >C++ >Comment SFINAE peut-il être utilisé efficacement avec les fonctions membres des modèles de classe ?

Comment SFINAE peut-il être utilisé efficacement avec les fonctions membres des modèles de classe ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-05 01:21:021027parcourir

How can SFINAE be used effectively with member functions of class templates?

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!

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