¿Existe una manera fácil de saber si una clase/estructura no tiene miembros de datos?

Resuelto Johan Kotlinski asked hace 13 años • 4 respuestas

Hola,

¿Existe alguna forma sencilla en C++ de saber (en tiempo de compilación) si una clase/estructura no tiene miembros de datos?

P.ejstruct T{};

Lo primero que pensé fue comparar sizeof(T)==0, pero siempre parece ser al menos 1.

La respuesta obvia sería simplemente mirar el código, pero me gustaría activar esto.

Johan Kotlinski avatar Jan 28 '11 20:01 Johan Kotlinski
Aceptado

Desde C++ 11, puedes usar el std::is_emptyrasgo .

Si sigue una dieta paleocompiladora, puede utilizar la implementación Boost.TypeTraits deis_empty . Se basa en la optimización de base vacía , que realizan todos los compiladores de C++ convencionales y garantiza que una clase base vacía no ocupe espacio en una clase derivada.

La implementación de Boost.TypeTraits utiliza una clase auxiliar que se deriva de la clase que el usuario desea probar y que tiene un tamaño fijo y conocido. Un resumen aproximado de la lógica es el siguiente:

template <typename T>
struct is_empty {
    struct helper : T { int x; };
    static bool const VALUE = sizeof(helper) == sizeof(int);
};

Sin embargo, tenga en cuenta que la implementación real de Boost es más compleja ya que necesita tener en cuenta funciones virtuales (todos los compiladores convencionales de C++ implementan clases con funciones virtuales agregando un miembro de datos invisible para la tabla de funciones virtuales a la clase). ¡Por lo tanto, lo anterior no es suficiente para implementarlo is_emptycorrectamente!

Konrad Rudolph avatar Jan 28 '2011 14:01 Konrad Rudolph

Si su compilador admite este aspecto de C++0x, puede utilizar std::is_emptydesde <type_traits>.

Su especificación es:

Tes un tipo de clase, pero no un tipo de unión, sin miembros de datos no estáticos distintos de los campos de bits de longitud 0, sin funciones miembro virtuales, sin clases base virtuales y sin clase base Bpara la cual is_empty<B>::valuees false.

No creo que exista una forma estándar de saber si una clase está vacía con respecto al polimorfismo.

GManNickG avatar Jan 28 '2011 14:01 GManNickG

Siguiendo la respuesta de Konrad, esto maneja clases con o sin funciones virtuales.

template <typename T>
struct is_empty {
    struct empty_ { virtual ~empty_(); };
    struct helper_ : T { virtual ~helper_(); };
    static bool const EMPTY = sizeof(helper_) == sizeof(empty_);
};
Nick Dandoulakis avatar Jan 28 '2011 14:01 Nick Dandoulakis