我想制作一个“接口”/混合类(模板),并确保没有人认为向这个类模板添加成员是个好主意,我想static_assert
在这种情况下。不幸的是,std::is_empty
不允许使用虚函数(因为多态类需要一些空间来存储它们的虚函数表指针或等效的实现细节)。
是否有std::is_empty
允许虚拟功能但不允许数据成员的变体(或者它很容易编写)?
我希望这个工作(加上我现在想不出的所有黑暗角落案例):
#include <type_traits>
struct A {};
struct B : A {};
struct AA { virtual ~AA() = default; };
struct BB : AA {};
static_assert(std::is_empty_v<A>);
static_assert(std::is_empty_v<B>);
// These should also work with the replacement for is_empty:
static_assert(std::is_empty_v<AA>);
static_assert(std::is_empty_v<BB>);
int main()
{}
我猜它需要编译器魔术或非常特定于平台的黑客/检查,具体取决于虚拟函数的实现方式。