[英]C++11 static_assert: Parameterized error messages
在我之前的问题中,我想使用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不是”。
这是用标准库实现的吗?
我看到两个挑战:
你不能做这个。 static_assert
想要一个字符串文字。 您无法将T
和Y
的语义标识组合到字符串文字中。
您可以希望编译器提供易于读取的模板实例化堆栈的回溯,并为您提供封闭类模板实例化的T
和Y
模板参数的值。
其他人也在考虑这个问题,例如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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.