2011-08-24 14 views
22

Belirli bir yapı türünün POD olup olmadığını sınayan bir C++ 0x static_assert olması (diğer programcıların istemeyerek yeni üyelerle bozmasını önlemek). yani Bir C++ 0x yapısının POD olup olmadığını belirlemek için bir derleme zamanı func/makro var mı?

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."); 
} 

is_pod_type() çeşit Burada kullanabileceğiniz makro veya içsel var mı? Herhangi bir C++ 0x belgesinde bulamadım, ancak elbette web'in 0x'deki bilgileri hala oldukça parçalı.

+1

Not C++ 0x'da, B yapısının POD olmaması gerektiğinden, bir * önemsiz varsayılan kurucu * yoktur (N3242'de 9.0.10 ve 9.0.6'ya bakın). Önemsiz bir varsayılan kurucu olarak tam olarak ne sayıldığından emin değilim (bkz. 12.1.5), ancak B() = default = 'ekleme yapısının B + + 0x POD'a dönüştürebileceğinden şüpheleniyorum. – Sjoerd

cevap

26

C++ 0x, bu tür bir iç içe geçirme için <type_traits> başlığında bir tür özellikleri kitaplığı tanıtır ve bir is_pod türü özelliği vardır.

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

Bunun için ISO taslak N3092 kullanıyorum, bu nedenle bu tarihten dışı olduğunu bir şans var: Ben aşağıdaki gibi static_assert ile birlikte kullanmak inanıyoruz. Bunu onaylamak için en son taslakta buna bakacağım.

EDIT: En son taslağa göre (N3242) bu hala geçerlidir. Bunu yapmanın yolu bu gibi görünüyor!

+0

Harika çalışıyor, teşekkürler! – Crashworks

+3

C++ 0x'da POD tanımının rahatlamış ve bölünmüş olduğunu unutmayın. Yani şimdi de std :: is_trivially_copyable <> 've' std :: is_standard_layout <> '(bağlantılı N3242'ye bakınız) var. Http://stackoverflow.com/questions/6496545/trivial-vs-standard-layout-vs-pod/6496703#6496703 adresine bakın; * önemsiz olarak kopyalanabilir * ve * standart düzen * ne anlama gelir. – Sjoerd

+0

@ Sjoerd- Bağlantı için teşekkürler! Bunu bilmiyordum. – templatetypedef

İlgili konular