2012-06-15 16 views
8

In my previous question ich static_assert verwenden wollte einen Template-Parameter zu beschränken einen spezifischen Subtyp zu sein. Die Frage beantwortet wurde, dass der Code für archieving ist wie folgt:C++ 11 static_assert: Parameterized Fehlermeldungen

template <typename T> 
struct X { 
    static_assert(std::is_base_of<Y,T>::value,"T must be derived from Y!"); 
}; 

Nun möchte ich die Fehlermeldung prägnanter machen. D.h., ich möchte angeben, welcher Typ diese Beschränkung verletzt. Z. B. wenn die Klasse A nicht von Y abgeleitet ist und jemand X<A> einführt, dann sollte die Fehlermeldung "Der Typparameter muss von Y abgeleitet sein, aber A ist nicht".

Ist das irgendwie mit der Standardbibliothek erreichbar?

Ich sehe zwei Herausforderungen:

  • Montage Saiten compiletime ohne boost :: mpl
  • den Namen des Typs abrufen, mit dem T instanziiert wurde. Der Name sollte aussagekräftig sein, idealerweise der gleiche wie in der verletzenden Definition. Ich habe versucht, Typid (T) .name(), aber es gibt nur den entstellten Namen, der nicht akzeptabel ist. Ich erinnere mich, dass es eine Art Makro gab, das den Namen von etwas zurückgibt, aber ich kann mich nicht mehr daran erinnern.
+1

Verwandte (peraps sogar übertölpeln): http://stackoverflow.com/q/6415186/34509 –

Antwort

7

Sie können dies nicht tun. static_assert möchte ein String-Literal. Sie haben keine Möglichkeit, die semantische Identität von T und Y in das Zeichenfolgenliteral zusammenzufassen.

können Sie hoffen, dass der Compiler eine einfache gibt Backtrace der Vorlage Instanziierung Stapel zu lesen und gibt Ihnen den Wert von T und Y Template-Parameter der umgebenden Klasse Vorlage Instanziierung.

Andere Leute dachten auch darüber nach, siehe zum Beispiel http://comments.gmane.org/gmane.comp.compilers.clang.devel/5073.

+0

Wie immer für die Diagnose, es ist ein QOI. –

+0

was für eine Schande. Warum ein Literal, eine Kompilierzeitkonstanten-Zeichenfolge wäre besser :(. – gexicide

+0

@gexicide Es ist normalerweise nicht praktikabel, Kompilierungszeitkonstantenstrings zu bilden. (Neben Literalen natürlich.) Drucken der Werte einer Sequenz von willkürlichen kompilieren- Zeitkonstante Werte und/oder Typ-IDs wäre aber nett, – Potatoswatter