C++ 当试图检测基类是否具有虚拟析构函数时,如何获取正确的编译器错误消息

C++ 当试图检测基类是否具有虚拟析构函数时,如何获取正确的编译器错误消息,c++,compiler-errors,c-preprocessor,C++,Compiler Errors,C Preprocessor,上下文:C++11 问题是,我不想从未定义虚拟析构函数的类继承 第一枪解决方案: #include <type_traits> #define assertHasVirtualDestructor(...) static_assert(std::has_virtual_destructor<__VA_ARGS__>::value, #__VA_ARGS__ ); class Base{}; class A : public Base { assertHasVi

上下文:C++11

问题是,我不想从未定义虚拟析构函数的类继承

第一枪解决方案:

#include <type_traits>

#define assertHasVirtualDestructor(...) static_assert(std::has_virtual_destructor<__VA_ARGS__>::value, #__VA_ARGS__ );

class Base{};
class A : public Base {
    assertHasVirtualDestructor(Base)
};
除了没有显示正确的上下文和派生自类的名称之外,它还提供了一条很好的错误消息


如何以可移植的方式解决此问题?

对于第一个问题,您可以将两个字符串逐字连接起来:

#define assertHasVirtualDestructor(...) static_assert(std::has_virtual_destructor<__VA_ARGS__>::value, "Somebody inherited from class " #__VA_ARGS__  " which doesn't define a virtual destructor")
#定义assertHasVirtualDestructor(…)static_assert(std::has_virtual_destructor::value,“从类中继承的某人”#u VA_ARGS_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu未定义虚拟析构函数)
由g++打印的错误:

x、 cpp:7:41:错误:静态断言失败:从未定义虚拟析构函数的类基类继承的某人

#定义assertHasVirtualDestructor(…)静态断言(std::has_virtual_destructor::value,“从类“#u VA_ARGS_uuu”继承的某人,该类未定义虚拟析构函数)

x、 cpp:11:2:注意:在宏“AsserthasVirtualStructor”的展开中 资产虚拟结构(基本)


预处理器与此有什么关系?@barman至于问题1,我想问的是如何让预处理器从##(u VA_ARGS)和一个文本字符串中生成一些漂亮的错误消息(即字符串),为了从SomebodyPubliclyInheritedFrom中访问第二个代码块中的类名,我认为需要某种预处理向导。Faik,预处理器对类或继承一无所知。@barman您的确是对的,但预处理器有基类的名称(即VA_ARGS)这是一个谁应该详细阐述它
#define assertHasVirtualDestructor(...) static_assert(std::has_virtual_destructor<__VA_ARGS__>::value, "Somebody inherited from class " #__VA_ARGS__  " which doesn't define a virtual destructor")