10

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.
1

2 Answers 2

8

You cannot do this. static_assert wants a string literal. You have no way to assemble the semantic identity of T and Y into 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 T and Y template 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.

Sign up to request clarification or add additional context in comments.

4 Comments

As always for diagnosis, it's a QOI.
what a shame. Why a literal, a compile time constant string would be better :(.
@gexicide It's not usually practical to form compile-time constant strings, anyway. (Besides literals, of course.) Printing the values of a sequence of arbitrary compile-time constant values and/or type-ids would be nice, though.
The link is dead now.
2

You can still use BOOST_MPL_ASSERT_MSG. It accepts the generic types as parameters and tries to include the concrete type names in the error message.

More information and examples here: http://www.boost.org/doc/libs/1_49_0/libs/mpl/doc/refmanual/assert-msg.html

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.