Есть ли простой способ определить, нет ли в классе / структуре данных-членов? - PullRequest
16 голосов
/ 28 января 2011

Привет,

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

Например, struct T{};

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

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

Ответы [ 4 ]

15 голосов
/ 28 января 2011

Начиная с 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);
};

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

12 голосов
/ 28 января 2011

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

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

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

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

1 голос
/ 28 января 2011

Если ответить на ответ Конрада, он обрабатывает классы с виртуальными функциями или без них.

0 голосов
/ 28 января 2011

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

...