2011-08-24 10 views
22

Mi piacerebbe avere un C++ 0x static_assert che verifica se un determinato tipo di struttura è POD (per impedire ad altri programmatori di interromperlo inavvertitamente con nuovi membri). vale a dire,Esiste una funzione/macro in fase di compilazione per determinare se una struttura C++ 0x è 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."); 
} 

C'è una sorta di is_pod_type() macro o intrinseca che posso usare qui? Non sono riuscito a trovarne uno in nessun documento C++ 0x, ma ovviamente le informazioni sul web su 0x sono ancora piuttosto frammentarie.

+1

Si noti che in C++ 0x, struct B non è POD perché non ha un costruttore * banale di default * (vedere 9.0.10 e 9.0.6 in N3242). Non sono sicuro di ciò che conta esattamente come un banale costruttore di default (vedi 12.1.5), ma sospetto che l'aggiunta di 'B() = default;' possa trasformare struct B in un COD 0x C++. – Sjoerd

risposta

26

C++ 0x introduce una libreria di caratteri di tipo nell'intestazione <type_traits> per questo tipo di introspezione e vi è un tratto di tipo is_pod. Credo che si usa in combinazione con static_assert come segue:

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

che sto usando ISO progetto N3092 per questo, quindi c'è una possibilità che questo non è aggiornato. Vado a dare un'occhiata alla bozza più recente per confermarlo.

MODIFICA: in base al progetto più recente (N3242), questo è ancora valido. Sembra che questo sia il modo per farlo!

+0

Funziona alla grande, grazie! – Crashworks

+3

Si noti che in C++ 0x, la definizione POD è stata rilassata e suddivisa. Quindi ora c'è anche 'std :: is_trivially_copyable <>' e 'std :: is_standard_layout <>' (vedi l'N3242 collegato). Vedi http://stackoverflow.com/questions/6496545/trivial-vs-standard-layout-vs-pod/6496703#6496703 per ciò che significa * banalmente copiabile * e * layout standard *. – Sjoerd

+0

@ Sjoerd- Grazie per il link! Non lo sapevo. – templatetypedef