Maison >développement back-end >C++ >Pourquoi SFINAE ne fonctionne-t-il pas avec les fonctions membres des modèles de classe ?

Pourquoi SFINAE ne fonctionne-t-il pas avec les fonctions membres des modèles de classe ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-04 21:55:02246parcourir

Why Doesn't SFINAE Work with Member Functions of Class Templates?

Pourquoi SFINAE (enable_if) ne fonctionne-t-il pas pour les fonctions membres d'un modèle de classe ?

En C , SFINAE (Substitution Failure Is Not An Error) vous permet de activer ou désactiver le code en fonction du type d'argument de modèle. Cependant, lorsqu'il s'agit de fonctions membres d'un modèle de classe, SFINAE ne fonctionne souvent pas comme prévu.

Voici un exemple qui illustre le problème :

<code class="cpp">#include <type_traits>

struct A {};
struct B {};

template <typename T>
struct Foo
{
    typename std::enable_if<std::is_same<T, A>::value>::type bar()
    {}

    typename std::enable_if<std::is_same<T, B>::value>::type bar()
    {}
};</code>

Dans cet exemple, Foo définit deux fonctions membres surchargées bar(). La première surcharge est activée lorsque T est A et la seconde est activée lorsque T est B. Cependant, si vous essayez de compiler ce code, vous recevrez un message d'erreur indiquant que les surcharges ne peuvent pas être résolues.

La raison de cette erreur est que SFINAE ne fonctionne que pour les arguments de modèle déduits. Dans le cas des fonctions membres d'un modèle de classe, l'argument du modèle n'est pas déduit mais plutôt spécifié explicitement. Pour résoudre le problème, vous pouvez utiliser l'une des techniques suivantes :

  • Utiliser des arguments de modèle explicites :

    <code class="cpp">struct Foo
    {
      void bar(A) {}
      void bar(B) {}
    };</code>
  • Utilisez std::enable_if dans les fonctions membres :

    <code class="cpp">template <typename T>
    struct Foo
    {
      template<typename U = T>
      typename std::enable_if<std::is_same<U, A>::value>::type bar() {}
    
      template<typename U = T>
      typename std::enable_if<std::is_same<U, B>::value>::type bar() {}
    };</code>
  • Utilisez la spécialisation de modèle de classe explicite :

    <code class="cpp">template <> struct Foo<A> { void bar() {} };
    template <> struct Foo<B> { void bar() {} };</code>

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