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

gstyhher  于 2023-01-28  发布在  其他
关注(0)|答案(4)|浏览(272)

你好,
在C++中有没有简单方法来判断(在编译时)一个类/结构体是否没有数据成员?
例如struct T{};
我的第一个想法是比较sizeof(T)==0,但这似乎总是至少为1。
显而易见的答案是只看代码,但我想打开它。

8wtpewkr

8wtpewkr1#

从C11开始,您可以使用std::is_empty trait
如果你正在使用古编译器,有一个窍门:你可以从这个类中派生一个新的helper类,然后检查sizeof(helper) == some_known_size是否是empty base optimisation,这依赖于empty base optimisation,所有主流的C
编译器都会执行empty base optimisation,并且确保一个空的基类在派生类中不会占用任何空间。
Boost在它的is_empty类型trait实现中做到了这一点。
总的纲要如下:

template <typename T>
struct is_empty {
    struct helper : T { int x; };
    static bool const VALUE = sizeof(helper) == sizeof(int);
};

实际的Boost实现更加复杂,因为它需要考虑虚函数(所有主流C++编译器都通过为virtual function table添加一个不可见的数据成员来实现具有虚函数的类)。

ycl3bljg

ycl3bljg2#

如果您的编译器支持C++0x的这一方面,则可以从<type_traits>使用std::is_empty
其规格为:
T是类类型,但不是联合类型,没有除长度为0的位字段之外的非静态数据成员,没有虚拟成员函数,没有虚拟基类,并且没有is_empty<B>::valuefalse的基类B
我不认为有一个标准的方法来判断一个类是否为空的多态性。

cbjzeqam

cbjzeqam3#

根据Konrad的答案,它可以处理带有或不带有虚函数的类。

template <typename T>
struct is_empty {
    struct empty_ { virtual ~empty_(); };
    struct helper_ : T { virtual ~helper_(); };
    static bool const EMPTY = sizeof(helper_) == sizeof(empty_);
};
g6ll5ycj

g6ll5ycj4#

最简单的答案,这两个工程,是标准投诉:查看class/struct的头文件及其类层次结构,它们会告诉你是否有数据元素(以及vtable)。

相关问题