C++ C++;11静态_断言:参数化错误消息
在中,我想使用static_assert将模板参数限制为特定的子类型。问题已回答,归档代码如下:C++ C++;11静态_断言:参数化错误消息,c++,templates,c++11,assertions,static-assert,C++,Templates,C++11,Assertions,Static Assert,在中,我想使用static_assert将模板参数限制为特定的子类型。问题已回答,归档代码如下: template <typename T> struct X { static_assert(std::is_base_of<Y,T>::value,"T must be derived from Y!"); }; 模板 结构X{ static_assert(std::is_base_of::value,“T必须从Y派生!”); }; 现在,我想让错误消息更简
template <typename T>
struct X {
static_assert(std::is_base_of<Y,T>::value,"T must be derived from Y!");
};
模板
结构X{
static_assert(std::is_base_of::value,“T必须从Y派生!”);
};
现在,我想让错误消息更简洁。也就是说,我想说明哪种类型违反了这个约束。例如,如果类A
不是从Y
派生的,并且有人实例化了X
,则错误消息应打印“类型参数必须从Y派生,但A不是”
这在标准库中是可以实现的吗
我看到两个挑战:
- 在编译时组装字符串而不使用boost::mpl
- 正在检索与T实例关联的类型的名称。名称应该有意义,理想情况下与定义中使用的名称相同。我尝试了typeid(T).name(),但它只返回不可接受的损坏名称。我记得有一种宏返回某个东西的名称,但我再也记不起了
- 您不能这样做
static\u assert
需要字符串文本。您无法将T
和Y
的语义标识组合到字符串文本中
您可以希望编译器提供一个易于阅读的模板实例化堆栈回溯,并提供封闭类模板实例化的T
和Y
模板参数值
其他人也想到了这一点,例如 您仍然可以使用
. 它接受泛型类型作为参数,并尝试在错误消息中包含具体的类型名称
更多信息和示例如下:
与以往诊断一样,这是一个QOI。真遗憾。为什么一个文本,一个编译时常量字符串会更好:(@gexicide无论如何,形成编译时常量字符串通常是不实际的。(当然,除了文本。)不过,打印任意编译时常量值和/或类型ID序列的值会很好。链接现在死了。相关(peraps甚至dupe):