Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11静态_断言:参数化错误消息_C++_Templates_C++11_Assertions_Static Assert - Fatal编程技术网

C++ C++;11静态_断言:参数化错误消息

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派生!”); }; 现在,我想让错误消息更简

在中,我想使用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派生!”);
};
现在,我想让错误消息更简洁。也就是说,我想说明哪种类型违反了这个约束。例如,如果类
A
不是从
Y
派生的,并且有人实例化了
X
,则错误消息应打印“类型参数必须从Y派生,但A不是”

这在标准库中是可以实现的吗

我看到两个挑战:

  • 在编译时组装字符串而不使用boost::mpl
  • 正在检索与T实例关联的类型的名称。名称应该有意义,理想情况下与定义中使用的名称相同。我尝试了typeid(T).name(),但它只返回不可接受的损坏名称。我记得有一种宏返回某个东西的名称,但我再也记不起了

    • 您不能这样做
      static\u assert
      需要字符串文本。您无法将
      T
      Y
      的语义标识组合到字符串文本中

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

      其他人也想到了这一点,例如

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

      更多信息和示例如下:

      与以往诊断一样,这是一个QOI。真遗憾。为什么一个文本,一个编译时常量字符串会更好:(@gexicide无论如何,形成编译时常量字符串通常是不实际的。(当然,除了文本。)不过,打印任意编译时常量值和/或类型ID序列的值会很好。链接现在死了。相关(peraps甚至dupe):