2017-12-28 44 views
3

Angenommen, ich habe dieses Programm, in dem ich eine Reihe von spezialisierten Typen und keinen allgemeinen Typ möchte. Wenn ich es kompiliere, würde ich gerne "Error: Int" anstelle von "Error: Z" bekommen. Ich habe versucht typeof(Z) und das hat mir nichts - gibt es einen Standard-Trick zu diesem Thema?Wie bekomme ich Typnamen in static_assert Fehler?

template<class Z> 
Z derp() 
{ 
    static_assert(false, "Error: Z"); 
} 

template <> 
double derp<double>() 
{ 
    return 5; 
} 


int main() 
{ 
    double b = derp<double>(); 
    int r = derp<int>(); 
    return 0; 
} 

Antwort

3

Streng genommen ist das Programm schlecht ausgebildet keine erforderliche Diagnose wegen dieser statischen Behauptung zu verletzen [temp.res]/8. Aber das ist leicht zu reparieren. Wir können nur die primäre Vorlage als gelöscht definieren:

Jetzt ist das Programm gut gebildet, es sei denn, die primäre Spezialisierung wird tatsächlich aufgerufen. Die meisten Compiler geben auch die Fehlermeldung, die Sie möchten. Hier ist Clang 5.0:

prog.cc:14:13: error: call to deleted function 'derp' 
    int r = derp<int>(); 
      ^~~~~~~~~ 
prog.cc:2:3: note: candidate function [with Z = int] has been explicitly deleted 
Z derp() = delete; 
^