在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派生,但是而不是”。使用标准库可以以某种方式实现吗?
我看到两个挑战:
最佳答案
你不能做这个。 static_assert
需要一个字符串文字。您无法将T
和Y
的语义标识组装到字符串文字中。
您可以希望编译器使模板实例化堆栈易于阅读,并为您提供封闭类模板实例化的T
和Y
模板参数的值。
其他人也考虑过这一点,例如http://comments.gmane.org/gmane.comp.compilers.clang.devel/5073。