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.
Verwandte (peraps sogar übertölpeln): http://stackoverflow.com/q/6415186/34509 –