2011-08-24 33 views
22

我想有一個C++ 0x static_assert測試給定的結構類型是否爲POD(以防止其他程序員無意中將其與新成員分開)。即,是否有編譯時func /宏來確定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."); 
} 

是否有某種is_pod_type()宏或內部我可以在這裏使用?我在任何C++ 0x文檔中找不到一個,但是當然,0x上的網絡信息仍然相當零碎。

+1

請注意,在C++ 0x中,struct B不是POD,因爲它沒有*簡單的默認構造函數*(請參閱N3242中的9.0.10和9.0.6)。我不確定什麼算作一個簡單的默認構造函數(見12.1.5),但懷疑添加'B()= default;'可能會將struct B轉換爲C++ 0x POD。 – Sjoerd

回答

26

的C++ 0x介紹在頭<type_traits>對於這種內省的類型性狀庫,且有一個is_pod型性狀。我相信,你會連同static_assert按如下方式使用它:

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

我使用的是ISO N3092草案這一點,所以有一個機會,這是過時的。我會在最近的草稿中查看以確認它。

編輯:根據最近的草案(N3242),這仍然有效。看起來這是做到這一點的方法!

+0

很好,謝謝! – Crashworks

+3

請注意,在C++ 0x中,POD定義已被放寬並被拆分。所以現在還有'std :: is_trivially_copyable <>'和'std :: is_standard_layout <>'(參見鏈接的N3242)。請參閱http://stackoverflow.com/questions/6496545/trivial-vs-standard-layout-vs-pod/6496703#6496703什麼* trivially可複製*和*標準佈局*的意思。 – Sjoerd

+0

@ Sjoerd-感謝您的鏈接!我不知道。 – templatetypedef

相關問題