你好,在C++中有没有简单方法来判断(在编译时)一个类/结构体是否没有数据成员?例如struct T{};我的第一个想法是比较sizeof(T)==0,但这似乎总是至少为1。显而易见的答案是只看代码,但我想打开它。
struct T{};
sizeof(T)==0
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实现中做到了这一点。总的纲要如下:
std::is_empty
helper
sizeof(helper) == some_known_size
is_empty
template <typename T> struct is_empty { struct helper : T { int x; }; static bool const VALUE = sizeof(helper) == sizeof(int); };
实际的Boost实现更加复杂,因为它需要考虑虚函数(所有主流C++编译器都通过为virtual function table添加一个不可见的数据成员来实现具有虚函数的类)。
ycl3bljg2#
如果您的编译器支持C++0x的这一方面,则可以从<type_traits>使用std::is_empty。其规格为:T是类类型,但不是联合类型,没有除长度为0的位字段之外的非静态数据成员,没有虚拟成员函数,没有虚拟基类,并且没有is_empty<B>::value是false的基类B。我不认为有一个标准的方法来判断一个类是否为空的多态性。
<type_traits>
T
is_empty<B>::value
false
B
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_); };
g6ll5ycj4#
最简单的答案,这两个工程,是标准投诉:查看class/struct的头文件及其类层次结构,它们会告诉你是否有数据元素(以及vtable)。
4条答案
按热度按时间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实现中做到了这一点。总的纲要如下:
实际的Boost实现更加复杂,因为它需要考虑虚函数(所有主流C++编译器都通过为virtual function table添加一个不可见的数据成员来实现具有虚函数的类)。
ycl3bljg2#
如果您的编译器支持C++0x的这一方面,则可以从
<type_traits>
使用std::is_empty
。其规格为:
T
是类类型,但不是联合类型,没有除长度为0的位字段之外的非静态数据成员,没有虚拟成员函数,没有虚拟基类,并且没有is_empty<B>::value
是false
的基类B
。我不认为有一个标准的方法来判断一个类是否为空的多态性。
cbjzeqam3#
根据Konrad的答案,它可以处理带有或不带有虚函数的类。
g6ll5ycj4#
最简单的答案,这两个工程,是标准投诉:查看class/struct的头文件及其类层次结构,它们会告诉你是否有数据元素(以及vtable)。