C ++ 11 static_assert:参数化错误消息

时间:2012-06-15 12:18:32

标签: c++ templates c++11 assertions static-assert

my previous question中,我想使用static_assert将模板参数限制为特定的子类型。问题得到了解答,获得批准的代码如下:

template <typename T> 
struct X { 
    static_assert(std::is_base_of<Y,T>::value,"T must be derived from Y!");
};

现在,我想让错误信息更简洁。即,我想说明哪种类型违反了这种约束。例如,如果类A不是从Y派生而有人实例化X<A>,那么错误消息应该打印“类型参数必须从Y派生,但 A 不是“。

标准库是否可以实现这一点?

我看到两个挑战:

  • 在不使用boost :: mpl
  • 的情况下在编译时组装字符串
  • 检索T被实例化的类型的名称。名称应该是有意义的,理想情况下与违反定义中使用的名称相同。我尝试了typeid(T).name()但它只返回了不可接受的受损名称。我记得有某种宏会返回某些东西的名字,但我不记得了。

2 个答案:

答案 0 :(得分:7)

你不能这样做。 static_assert想要一个字符串文字。您无法将TY的语义标识组合到字符串文字中。

您可以希望编译器提供易于读取的模板实例化堆栈的回溯,并为您提供封闭类模板实例化的TY模板参数的值。

其他人也在考虑这个问题,例如http://comments.gmane.org/gmane.comp.compilers.clang.devel/5073

答案 1 :(得分:2)

你仍然可以使用 BOOST_MPL_ASSERT_MSG。它接受泛型类型作为参数,并尝试在错误消息中包含具体的类型名称。

此处提供更多信息和示例: http://www.boost.org/doc/libs/1_49_0/libs/mpl/doc/refmanual/assert-msg.html