在c ++ / c ++ 11中测试“POD-ness”?

时间:2012-09-02 01:30:04

标签: c++ types c++11 pod

我有一些代码采用打包的POD结构/类并将其复制到内存块中。

struct A
{
   int a;
   int b;
} a;

memcpy(mymemoryblock, (void *)&a, sizeof(A));

// later I get a reply and...

memcpy((void *)&a, mymemoryblock, sizeof(A));

这仅适用于POD类型的数据,如果有一种方法可以测试POD-ness,我想知道什么。如果有人不小心将成员函数添加到此类,则memcpy操作将变为无效,但仍可编译。这导致很难发现错误。

是否存在is_POD_type(A)函数或其他可用于在运行时或编译时检测PODness的技巧?

3 个答案:

答案 0 :(得分:13)

C ++ 11中的

std::is_pod<A>::value

[编辑:请参阅上面的Luc的评论,在C ++ 11中,你不需要为你所做的事情提供POD类型。

就此而言,你也不需要转换为void*,并且不必要地向void*投射C风格的指针是有点冒险的,因为有一天你会抛弃const 1}}偶然!]

在C ++ 03中,没有标准的方法可以做到这一点,但是Boost有自己的is_pod,在编译器方面不谨慎,因为它们没有提供非标准的查找方法。因此,如果您编写POD特例是优化的代码,那么它很有用(您无法在任何地方获得优化)。如果您只关心Boost可以获得准确答案的编译器,这也很有用。如果is_pod的误报导致你的代码厌恶地放弃,那就不太好了。

答案 1 :(得分:4)

标准(C ++ 98)说只有具有类C构造/破坏语义的类型才能成为联合的成员。这涵盖了大多数会使类型为非POD的事情,因此只需使用类型A的成员定义联合类型,如果A不是POD,编译器应该抱怨。

答案 2 :(得分:0)

存在一种调用std :: tr1 :: is_pod

的方法

你也可以使用bycicle:

#define CHECK_TYPE_IS_A_POD(TYPE)\
{\
  switch(1)\
  {\
    case 1:\
        TYPE IF_COMPILE_ERROR_THEN__##TYPE##__IS_NOT_A_POD;\
        /* prune out any warnings about not usage */ \
        IF_COMPILE_ERROR_THEN__##TYPE##__IS_NOT_A_POD = TYPE();\
    case 2:\
        ;\
  }\

但它对名称空间限定名称和专用模板类型不起作用。