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

时间:2011-01-28 13:57:10

标签: c++ class struct size member

喂,

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

E.g。 struct T{};

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

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

4 个答案:

答案 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}} Bis_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)。