喂,
在C ++中有一些简单的方法可以告诉(在编译时)类/结构是否没有数据成员吗?
E.g。 struct T{};
我的第一个想法是比较sizeof(T)==0
,但这似乎总是至少为1。
显而易见的答案是只看代码,但我想打开它。
答案 0 :(得分:15)
从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);
};
但是,这依赖于空基类优化(但所有现代编译器都这样做)。
答案 1 :(得分:12)
如果您的编译器支持C ++ 0x的这个方面,您可以使用std::is_empty
中的<type_traits>
。
它的规格是:
T
是类类型,但不是联合类型,除了长度为0的位字段,没有虚拟成员函数,没有虚拟基类,也没有基类之外没有非静态数据成员{ {1}}B
为is_empty<B>::value
。{/ p>
我不认为有一种标准的方法可以找到关于多态性的类是否为空。
答案 2 :(得分:1)
踩着Konrad的回答,这会处理带或不带虚函数的类。
template <typename T>
struct is_empty {
struct empty_ { virtual ~empty_(); };
struct helper_ : T { virtual ~helper_(); };
static bool const EMPTY = sizeof(helper_) == sizeof(empty_);
};
答案 3 :(得分:-1)
最简单的答案是,它既有效又是标准的抱怨:查看类/结构及其类层次结构的头文件。他们会告诉你是否有数据元素(以及vtable)。