Maison développement back-end C++ Pourquoi SFINAE échoue-t-il pour les fonctions membres du modèle de classe ?

Pourquoi SFINAE échoue-t-il pour les fonctions membres du modèle de classe ?

Nov 04, 2024 pm 10:18 PM

Why Does SFINAE Fail for Class Template Member Functions?

Échec de SFINAE pour les fonctions membres du modèle de classe

Le mécanisme d'échec de remplacement n'est pas une erreur (SFINAE), couramment utilisé dans la métaprogrammation de modèles, semble présenter un comportement particulier lorsqu'il est appliqué aux fonctions membres du modèle de classe.

Le problème

Considérez l'extrait de code suivant :

<code class="cpp">#include &lt;type_traits&gt;

struct A{};
struct B{};

template &lt;typename T&gt;
struct Foo
{
    // Conditional enable bar() for T == A
    typename std::enable_if&lt;std::is_same&lt;T, A&gt;::value&gt;::type
    bar()
    {}

    // Conditional enable bar() for T == B
    typename std::enable_if&lt;std::is_same&lt;T, B&gt;::value&gt;::type
    bar()
    {}
};</code>
Copier après la connexion

Ce code tente de définir deux surcharges de bar() dans le modèle de classe Foo, avec SFINAE utilisé pour activer conditionnellement chaque surcharge en fonction de la valeur de T. Cependant, le code ne parvient pas à se compiler avec l'erreur suivante :

<code class="cpp">error: 'typename std::enable_if&lt;std::is_same&lt;T, B&gt;::value&gt;::type Foo&lt;T&gt;::bar()' cannot be overloaded</code>
Copier après la connexion

L'explication

SFINAE est généralement utilisée pour activer ou désactiver les spécialisations de modèles en fonction des arguments du modèle. Cependant, SFINAE ne s'applique qu'aux arguments de modèle déduits, c'est-à-dire aux arguments qui sont automatiquement déduits lors de la résolution de la surcharge. Dans le cas des fonctions membres, les arguments du modèle ne sont pas déduits mais plutôt explicitement spécifiés lors de l'instanciation de la classe. Par conséquent, SFINAE n'est pas applicable aux fonctions membres.

La solution

Il existe deux manières principales de résoudre ce problème :

  • Utilisez des modèles de fonctions : Définissez des modèles de fonctions distincts pour chaque surcharge, comme indiqué ci-dessous :
<code class="cpp">template &lt;typename T&gt;
void bar(Foo&lt;T&gt;&lt;- A) {}

template &lt;typename T&gt;
void bar(Foo&lt;T&gt;&lt;- B) {}
Copier après la connexion
  • Utilisez une spécialisation de modèle de classe explicite : Définissez des modèles de classe pour chaque surcharge, comme indiqué ci-dessous :
<code class="cpp">template &lt;typename&gt; struct Foo;

template &lt;&gt; struct Foo&lt;A&gt; { void bar() {} };
template &lt;&gt; struct Foo&lt;B&gt; { 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!

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

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quels sont les types de valeurs renvoyées par les fonctions du langage C? Qu'est-ce qui détermine la valeur de retour? Quels sont les types de valeurs renvoyées par les fonctions du langage C? Qu'est-ce qui détermine la valeur de retour? Mar 03, 2025 pm 05:52 PM

Quels sont les types de valeurs renvoyées par les fonctions du langage C? Qu'est-ce qui détermine la valeur de retour?

Gulc: Cibliothèque C construite à partir de zéro Gulc: Cibliothèque C construite à partir de zéro Mar 03, 2025 pm 05:46 PM

Gulc: Cibliothèque C construite à partir de zéro

C Fonction Langue Format de lettre ÉTAPES DE CONVERSION DE CAS C Fonction Langue Format de lettre ÉTAPES DE CONVERSION DE CAS Mar 03, 2025 pm 05:53 PM

C Fonction Langue Format de lettre ÉTAPES DE CONVERSION DE CAS

Quelles sont les définitions et les règles d'appel des fonctions du langage C et quelles sont les Quelles sont les définitions et les règles d'appel des fonctions du langage C et quelles sont les Mar 03, 2025 pm 05:53 PM

Quelles sont les définitions et les règles d'appel des fonctions du langage C et quelles sont les

Utilisation distincte et partage de phrases Utilisation distincte et partage de phrases Mar 03, 2025 pm 05:51 PM

Utilisation distincte et partage de phrases

Où est la valeur de retour de la fonction de langue C stockée en mémoire? Où est la valeur de retour de la fonction de langue C stockée en mémoire? Mar 03, 2025 pm 05:51 PM

Où est la valeur de retour de la fonction de langue C stockée en mémoire?

Comment fonctionne la bibliothèque de modèle standard C (STL)? Comment fonctionne la bibliothèque de modèle standard C (STL)? Mar 12, 2025 pm 04:50 PM

Comment fonctionne la bibliothèque de modèle standard C (STL)?

Comment utiliser efficacement les algorithmes du STL (trier, trouver, transformer, etc.)? Comment utiliser efficacement les algorithmes du STL (trier, trouver, transformer, etc.)? Mar 12, 2025 pm 04:52 PM

Comment utiliser efficacement les algorithmes du STL (trier, trouver, transformer, etc.)?

See all articles