Есть ли простой способ узнать, нет ли у класса/структуры данных?
Алло,
есть ли простой способ в С++ сказать (во время компиляции), если класс/структура не имеет элементов данных?
например. 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).