In my previous question I wanted to use static_assert to restrict a template parameter to be a specific subtype. The question was answered, the code for archieving that is as follows:
template <typename T>
struct X {
static_assert(std::is_base_of<Y,T>::value,"T must be derived from Y!");
};
Now, I want to make the error message more concise. I.e., I want to state which type is violating this constraint. E.g., if class A is not derived from Y and someone instanciates X<A>, then the error message should print “The type parameter must be derived from Y, but A isn’t”.
Is this somehow achievable with the standard library?
I see two challenges:
- Assembling strings at compiletime without using boost::mpl
- retrieving the name of the type with which T was instanciated. The name should be meaningful, ideally the same as used in the violating definition. I tried typeid(T).name() but it only returns the mangled name which is not acceptable. I remember that there was some kind of macro that returns the name of something, but I cannot recall that anymore.
You cannot do this.
static_assertwants a string literal. You have no way to assemble the semantic identity ofTandYinto the string literal.You can hope that the compiler gives an easy to read backtrace of the template instantiation stack and gives you the value of
TandYtemplate parameters of the enclosing class template instantiation.Other people thought about this too, see http://comments.gmane.org/gmane.comp.compilers.clang.devel/5073 for example.