我有一些代码采用打包的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的技巧?
答案 0 :(得分:13)
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:\
;\
}\
但它对名称空间限定名称和专用模板类型不起作用。