2011-08-24 12 views
22

Me gustaría tener un C++ 0xstatic_assert que compruebe si un tipo de estructura dada es POD (para evitar que otros programadores lo rompa inadvertidamente con nuevos miembros). es decir,¿Hay un func/macro en tiempo de compilación para determinar si una estructura de C++ 0x es POD?

struct A // is a POD type 
{ 
    int x,y,z; 
} 

struct B // is not a POD type (has a nondefault ctor) 
{ 
    int x,y,z; 
    B(int _x, int _y, int _z) : x(_x), y(_y), z(_z) {} 
} 

void CompileTimeAsserts() 
{ 
    static_assert(is_pod_type(A) , "This assert should not fire."); 
    static_assert(is_pod_type(B) , "This assert will fire and scold whoever added a ctor to the POD type."); 
} 

¿Existe algún tipo de is_pod_type() macro o intrínseca que puedo usar aquí? No pude encontrar ninguno en ningún documento de C++ 0x, pero por supuesto la información de la web en 0x todavía es bastante fragmentaria.

+1

Tenga en cuenta que en C++ 0x, la estructura B no es POD porque no tiene un * constructor predeterminado * trivial (ver 9.0.10 y 9.0.6 en N3242). No estoy seguro de qué cuenta exactamente como un constructor predeterminado trivial (ver 12.1.5), pero sospecho que al agregar 'B() = default;' podría convertir la estructura B en un C++ 0x POD. – Sjoerd

Respuesta

26

C++ 0x introduce una biblioteca de rasgos de tipo en el encabezado <type_traits> para este tipo de introspección, y hay un rasgo de tipo is_pod. Creo que lo utilizaría en conjunción con static_assert de la siguiente manera:

static_assert(std::is_pod<A>::value, "A must be a POD type."); 

estoy usando ISO proyecto N3092 para esto, así que hay una posibilidad de que esto está fuera de fecha. Buscaré esto en el borrador más reciente para confirmarlo.

EDIT: De acuerdo con el borrador más reciente (N3242), esto sigue siendo válido. ¡Parece que esta es la manera de hacerlo!

+0

Funciona muy bien, gracias! – Crashworks

+3

Tenga en cuenta que en C++ 0x, la definición de POD se ha relajado y dividido. Entonces ahora también hay 'std :: is_trivially_copyable <>' y 'std :: is_standard_layout <>' (ver el N3242 enlazado). Ver http://stackoverflow.com/questions/6496545/trivial-vs-standard-layout-vs-pod/6496703#6496703 para lo que * trivially copyable * and * layout estándar * significa. – Sjoerd

+0

@ Sjoerd- ¡Gracias por el enlace! No sabía eso. – templatetypedef

Cuestiones relacionadas