9

我之前的问题中,我想使用 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() 但它只返回不可接受的损坏名称。我记得有某种宏可以返回某物的名称,但我想不起来了。
4

2 回答 2

8

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

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

其他人也考虑过这一点,例如参见http://comments.gmane.org/gmane.comp.compilers.clang.devel/5073 。

于 2012-06-15T12:23:16.277 回答
2

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

更多信息和示例在这里: http: //www.boost.org/doc/libs/1_49_0/libs/mpl/doc/refmanual/assert-msg.html

于 2012-06-16T09:50:50.547 回答