2011-08-24 32 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

相关问题