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

C++11 static_assert: Parameterized error messages

本文关键字:错误 消息 参数 static assert C++11      更新时间:2023-10-16

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

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

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

其他人也想到了这一点,例如 http://comments.gmane.org/gmane.comp.compilers.clang.devel/5073。

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

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