C ++ 11 static_assert: Parametrisierte Fehlermeldungen

8

In meine vorherige Frage Ich wollte static_assert verwenden, um einen Template-Parameter auf einen bestimmten Subtyp zu beschränken. Die Frage wurde beantwortet, der Code für das Archivieren lautet wie folgt:

%Vor%

Nun möchte ich die Fehlermeldung präziser machen. D.h., ich möchte angeben, welcher Typ diese Beschränkung verletzt. Wenn beispielsweise die Klasse A nicht von Y abgeleitet wird und jemand X<A> angibt, sollte die Fehlermeldung ausgegeben werden "Der Typparameter muss von Y abgeleitet sein, aber A ist nicht" .

Ist das irgendwie mit der Standardbibliothek erreichbar?

Ich sehe zwei Herausforderungen:

  • Zusammenfügen von Strings bei Compiletime ohne Verwendung von boost :: mpl
  • Abrufen des Namens des Typs, 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.
gexicide 15.06.2012, 12:18
quelle

2 Antworten

7

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

Sie können hoffen, dass der Compiler eine leicht lesbare Rückverfolgung des Template-Instanziierungs-Stacks bietet und Ihnen den Wert der T - und Y -Template-Parameter der umschließenden Klassen-Template-Instantiierung gibt.

Andere Leute haben auch darüber nachgedacht, siehe Ссылка zum Beispiel.

    
Johannes Schaub - litb 15.06.2012, 12:23
quelle
2

Sie können immer noch verwenden BOOST_MPL_ASSERT_MSG . Er akzeptiert die generischen Typen als Parameter und versucht, die konkreten Typnamen in die Fehlermeldung aufzunehmen.

Weitere Informationen und Beispiele hier: Ссылка

    
zah 16.06.2012 09:50
quelle