SFINAE: erkennt die Existenz einer Template-Funktion, die eine explizite Spezialisierung erfordert

8

Als Follow-up zu meine vorherige Frage , versuche ich die Existenz einer Template-Funktion zu erkennen, die eine explizite Spezialisierung erfordert.

Mein aktueller Arbeitscode erkennt Nicht-Template-Funktionen (dank der Hilfe von DyP), vorausgesetzt, dass sie mindestens einen Parameter verwenden, so dass die abhängige Namenssuche verwendet werden kann:

%Vor%

(das ENABLE_FOO_BAR -Makro dient nur zu Testzwecken, in meinem echten Code habe ich kein solches Makro verfügbar, sonst würde ich SFINAE nicht verwenden)

Dies funktioniert auch perfekt mit Template-Funktionen, wenn ihre Template-Argumente automatisch vom Compiler abgeleitet werden können:

%Vor%

Wenn ich jedoch versuche, eine Template-Funktion zu finden, die eine explizite Spezialisierung erfordert, tritt static_assert in ein, wenn foo::bar() existiert :

%Vor%

Offensichtlich kann der Compiler die Template-Argumente von bar() nicht ableiten, so dass die Erkennung fehlschlägt. Ich versuchte es zu beheben, indem ich den Aufruf explizit spezialisierte:

%Vor%

Das funktioniert gut, wenn foo::bar() existiert (die Funktion wurde korrekt erkannt), aber jetzt bricht die Hölle los wenn foo::bar() nicht existiert :

%Vor%

Mein Versuch einer expliziten Spezialisierung ist fehlgeschlagen, weil der Compiler nicht weiß, dass bar eine Vorlage ist.

Ich werde Ihnen alles ersparen, was ich versucht habe, um dies zu beheben und direkt zum Punkt zu kommen: Wie kann ich die Existenz einer Funktion wie template<typename T, typename U> T bar(U); erkennen, die eine explizite Spezialisierung erfordert, um instanziiert zu werden?

    
syam 21.09.2013, 18:45
quelle

1 Antwort

2

Folgendes könnte Ihnen helfen:

%Vor%

Also mit dem angegebenen Namespace mit bar und ohne bar2

%Vor%

Code, der das Vorhandensein von bar<int, int> und bar2<int, int> prüft.

%Vor%     
Jarod42 30.12.2013 01:20
quelle