Есть ли простой способ узнать, нет ли у класса/структуры данных?

Алло,

есть ли простой способ в С++ сказать (во время компиляции), если класс/структура не имеет элементов данных?

например. struct T{};

Моя первая мысль заключалась в сравнении sizeof(T)==0, но это всегда кажется как минимум 1.

Очевидным ответом будет просто посмотреть на код, но я хотел бы включить его.

Ответы

Ответ 1

Вы можете получить этот класс в другом пустом и проверить, есть ли 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);
};

Однако это зависит от оптимизации пустого базового класса (но все современные компиляторы делают это).

Ответ 2

Если ваш компилятор поддерживает этот аспект С++ 0x, вы можете использовать std::is_empty из <type_traits>.

Это спецификация:

T - тип класса, но не тип объединения, без нестатических членов данных, отличных от бит-полей длины 0, не виртуальных функций-членов, не виртуальных базовых классов и базового класса B для которых is_empty<B>::value false.

Я не думаю, что существует стандартный способ найти, является ли класс пустым в отношении полиморфизма.

Ответ 3

Нажав на Konrad ответ, он обрабатывает классы с виртуальными функциями или без них.

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

Ответ 4

Самый простой ответ на этот вопрос: как работает, так и является стандартной жалобой: посмотрите на файлы заголовков для класса/структуры и его иерархии классов. Они расскажут вам, есть ли элементы данных (а также vtable).