"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 ?

Publié le 2024-11-10
Parcourir:198

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 :

#include 

struct A {};
struct B {};

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

    typename std::enable_if<:is_same b>::value>::type bar()
    {}
};

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 :

    struct Foo
    {
      void bar(A) {}
      void bar(B) {}
    };
  • Utilisez std::enable_if dans les fonctions membres :

    template 
    struct Foo
    {
      template
      typename std::enable_if<:is_same a>::value>::type bar() {}
    
      template
      typename std::enable_if<:is_same b>::value>::type bar() {}
    };
  • Utiliser la spécialisation de modèle de classe explicite :

    template  struct Foo { void bar() {} };
    template  struct Foo { void bar() {} };
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3