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
Libérer: 2024-11-04 21:55:02
original
266 Les gens l'ont consulté

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>
Copier après la connexion

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>
    Copier après la connexion
  • 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>
    Copier après la connexion
  • 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>
    Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal