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.