Das ist nur eine Frage zum Stil: Ich mag die Art und Weise von C ++ für die Template-Metaprogrammierung nicht, die erfordert, dass Sie den Rückgabetyp verwenden oder ein zusätzliches Dummy-Argument für die Tricks mit SFINAE hinzufügen. Also, die Idee, die ich mir ausgedacht habe, ist, die SFINAE-Sache in die Definition der Template-Argumente selbst zu stellen, so:
%Vor%Dieses Beispiel lässt g ++ klagen:
../ src / afg.cpp: 10: 97: Fehler: Neudefinition von 'template void asd ()'
SFINAE dort selbst funktioniert, denn wenn ich zum Beispiel den mit disable_if
lösche, ist der Compilerfehler:
../ src / afg.cpp: 15: 12: Fehler: keine übereinstimmende Funktion für den Aufruf von 'asd ()'
Was ich will.
Also, gibt es eine Möglichkeit, SFINAE nicht in der "normalen" Signatur einer Funktion zu erreichen, das ist Rückgabetyp + Argumentliste?
BEARBEITEN: Das ist am Ende, was ich im echten Code versuchen werde:
%Vor%Ich benutze C ++ 0x Sachen statt Boost, denn solange ich C ++ 0x für die Verwendung der Standardwerte von Template-Argumenten brauche, sehe ich keinen Grund, boost zu verwenden, was der Vorläufer ist.
Standardschablonenargumente sind nicht Teil der Signatur von Funktionsschablonen. Aber die Art der Template-Parameter ist. So können Sie Folgendes tun und in der Lage sein, es zu überlasten
%Vor% Seit C ++ 11 es möglich gemacht hat, verwende ich immer enable_if
(oder umgekehrt disable_if
) innerhalb der Template-Argumente, so wie du es tust. Wenn / wenn es mehrere Überlastungen gibt, dann verwende ich Dummy, default-Template-Argumente, die die Template-Parameter-Listen unterscheiden. Um das Beispiel wiederzuverwenden, wäre das:
Eine andere Alternative, um den Rückgabetyp (der in einigen Fällen nicht verfügbar ist, z. B. Konvertierungsoperatoren), der seit C ++ 03 existiert, nicht zu verwirren, ist die Verwendung von Standardargumenten:
%Vor%Ich benutze dieses Formular nicht, weil ich es nicht mag, die Argumenttypen genauso zu verwirren wie mit dem Rückgabetyp und aus Gründen der Konsistenz (da dies nicht in allen Fällen möglich ist).
Nun, im Allgemeinen benutze ich diese Makros, um enable_if Konstrukte viel sauberer zu machen (sie funktionieren sogar in den meisten C ++ 03 Compilern):
%Vor%Dann würden Sie Ihre Funktion wie folgt definieren:
%Vor%Die einzige Sache ist, dass Sie Klammern um den Rückgabetyp legen müssen. Wenn Sie sie vergessen, sagt der Compiler etwas wie 'ERROR_PARENTHESIS_MUST_BE_PLACED_AROUND_THE_RETURN_TYPE' ist undefiniert.
Das mag nicht genau das sein, wonach Sie fragen, aber wie steht es mit einer guten alten Template-Spezialisierung?
%Vor%Also, gibt es eine Möglichkeit, SFINAE nicht in der "normalen" Signatur einer Funktion zu erreichen, das ist Rückgabetyp + Argumentliste?
Nun, es gibt eine Möglichkeit, das gleiche Ergebnis zu erhalten, ohne SFINAE zu verwenden - Überladung:
%Vor%Dieser Stil ist IMO weit besser lesbar und wird häufig in schablonenlastigen Bibliotheken wie Boost verwendet. Spirit , da es dazu neigt, schneller zu kompilieren, und besser mit Compilern funktioniert, die weniger als Template- / SFINAE-Unterstützung haben (z. B. VC ++ und Sun Studio).