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