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:
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.
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: Ссылка
Tags und Links c++ c++11 templates static-assert assertions