Kann ich SFINAE deaktivieren?

9

Angenommen, ich habe dieses Programm

%Vor%

Live-Beispiel

Ich könnte den Spezifizierer auto aus verschiedenen Gründen benötigen, aber das obige Programm erzeugt den folgenden Fehler:

%Vor%

Obwohl es wahr ist, ist es nicht besonders hilfreich. Es ist offensichtlich, dass ich in diesem Beispiel vergessen habe, C::type anzugeben, aber Sie können sehen, dass dies in größeren Programmen sehr verwirrend werden könnte.

Der echte Grund für den Fehler ist in der Compiler-Fehlermeldung ein paar Zeilen tiefer vergraben:

  

prog.cpp: 7: 15: Fehler: kein Typ namens 'type' in 'struct C'

In einer tatsächlichen Codebasis könnte diese Nachricht unter Hunderten oder Tausenden (oder Hunderten von Tausend) Zeilen von Fehlermeldungen (und über einer gleich großen Menge von Nachrichten, die aus einer anderen Änderung stammen könnten) sein ). Wenn man bedenkt, dass wir in einem realen Szenario vielleicht nicht einmal wissen, wonach wir suchen müssen, könnte das sehr verwirrend sein.

Ein Fehler, der mir einfach sagt, dass die Deklaration von A fehlgeschlagen ist, weil C::type nicht deklariert wurde, wäre viel hilfreicher gewesen.

Es gibt natürlich viele Situationen, in denen SFINAE nützlich und notwendig ist, also möchte ich diese Sprachfunktion nicht irgendwie ausschalten. Aber kann ich die SFINAE-Regeln für diese spezielle Funktion deaktivieren?

Mit anderen Worten, kann ich der Funktionsdeklaration etwas hinzufügen, um forcieren den Compiler zu versuchen, die Funktion zu kompilieren und einen Fehler zu erzeugen, wenn ein Fehlschlag auftritt?

    
arman 26.08.2014, 02:36
quelle

1 Antwort

4

Es gibt keine Möglichkeit, SFINAE zu deaktivieren. C ++ hat keine Funktionen zum Aktivieren und Deaktivieren nach Belieben. Es gibt eine Möglichkeit, den SF-Teil niemals zu passieren, sodass das E anderswo ausgelöst wird.

%Vor%

get_type (das niemals fehlschlägt) und has_type (mit SFINAE) sind Standardübungen, die überall beschrieben werden.

    
n.m. 26.08.2014, 05:10
quelle

Tags und Links