在我以前的问题中,我希望使用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不是”。
这在标准库中是可以实现的吗?
我看到两个挑战:
发布于 2012-06-15 12:23:16
你不能这么做。static_assert
需要一个字符串文本。您无法将T
和Y
的语义标识组装到字符串文本中。
您可以希望编译器能够轻松地读取模板实例化堆栈的回溯跟踪,并给出封装类模板实例化的T
和Y
模板参数的值。
其他人也考虑到了这一点,例如,参见http://comments.gmane.org/gmane.comp.compilers.clang.devel/5073。
https://stackoverflow.com/questions/11050511
复制相似问题