是否有一种简单的方法来判断类/结构是否没有数据成员?

Joh*_*ski 17 c++ size struct class member

你好,

是否有一些简单的方法在C++中告诉(在编译时)类/结构是否没有数据成员?

例如 struct T{};

我的第一个想法是比较sizeof(T)==0,但这似乎总是至少1.

显而易见的答案是只看代码,但我想打开它.

Kon*_*lph 16

从C++ 11开始,您可以使用标准std::is_empty特征:https://en.cppreference.com/w/cpp/types/is_empty

如果你是古代编译器的饮食,有一个诀窍:你可以从另一个空派生出这个类并检查是否sizeof(OtherClass) == 1.Boost在其is_empty类型特征中做到这一点.

未经测试:

template <typename T>
struct is_empty {
    struct helper_ : T { int x; };
    static bool const VALUE = sizeof(helper_) == sizeof(int);
};
Run Code Online (Sandbox Code Playgroud)

但是,这依赖于空基类优化(但所有现代编译器都这样做).

  • @Ashot:这不应该"不会起作用",因为"如果给出一些空的定义,就不会起作用". (5认同)
  • 不管用.正如CashCow所说,这对具有虚函数的类不起作用. (2认同)

GMa*_*ckG 12

如果您的编译器支持C++ 0x的这个方面,您可以使用std::is_emptyfrom <type_traits>.

它的规格是:

T是一个类型,但不是一个联合类型,具有比长度为0的位字段,没有虚成员函数,没有虚基类的其他没有非静态数据成员,并且没有基类B为,其is_empty<B>::valuefalse.

我不认为有一种标准的方法来查找类是否为多态的空.

  • @Ashot:"在大多数编译器上"我通常不会考虑编译器.:) (4认同)