„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum funktioniert SFINAE nicht mit Mitgliedsfunktionen von Klassenvorlagen?

Warum funktioniert SFINAE nicht mit Mitgliedsfunktionen von Klassenvorlagen?

Veröffentlicht am 10.11.2024
Durchsuche:875

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

Warum funktioniert SFINAE (enable_if) nicht für Mitgliedsfunktionen einer Klassenvorlage?

In C ermöglicht Ihnen SFINAE (Substitution Failure Is Not An Error). Aktivieren oder deaktivieren Sie Code je nach Typ eines Vorlagenarguments. Beim Umgang mit Mitgliedsfunktionen einer Klassenvorlage funktioniert SFINAE jedoch häufig nicht wie erwartet.

Hier ist ein Beispiel, das das Problem veranschaulicht:

#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()
    {}
};

In diesem Beispiel definiert Foo zwei überladene Memberfunktionen bar(). Die erste Überladung ist aktiviert, wenn T A ist, und die zweite ist aktiviert, wenn T B ist. Wenn Sie jedoch versuchen, diesen Code zu kompilieren, erhalten Sie eine Fehlermeldung, die darauf hinweist, dass die Überladungen nicht aufgelöst werden können.

Der Grund für diesen Fehler ist, dass SFINAE nur für abgeleitete Vorlagenargumente funktioniert. Bei Memberfunktionen einer Klassenvorlage wird das Vorlagenargument nicht abgeleitet, sondern explizit angegeben. Um das Problem zu beheben, können Sie eine der folgenden Techniken verwenden:

  • Verwenden Sie explizite Vorlagenargumente:

    struct Foo
    {
      void bar(A) {}
      void bar(B) {}
    };
  • Verwenden Sie std::enable_if innerhalb der Mitgliedsfunktionen:

    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() {}
    };
  • Explizite Klassenvorlagenspezialisierung verwenden:

    template  struct Foo { void bar() {} };
    template  struct Foo { void bar() {} };
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3