我有一些代码,这需要填充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岬什么。 如果有人不小心添加了一个成员函数,这个类中,memcpy的操作变得无效,但仍编译。 这导致很难检测到的错误。
是否有一个is_POD_type(A)的功能,或可用于检测PODness在运行时或编译时的一些其他的把戏?
std::is_pod<A>::value
在C ++ 11。
[编辑:指吕克的评论以上,在C ++ 11,你不需要类型为POD为你在做什么。
对于这个问题,你也不必强制转换为void*
,和C风格的铸造指针void*
不必要是一点点的风险,因为有一天你会抛弃const
意外!]
在C ++ 03有做到这一点没有标准方法,但升压都有自己is_pod
是谨慎的侧抱错编译器不提供非标准的方式找出来。 所以,如果你正在写的代码,其中POD特殊情况,是一个优化是非常有用的(你是不会得到优化无处不在)。 这也是有用的,如果你只关心编译器,其升压能得到一个准确的答案。 如果假阴性由这不是那么好is_pod
导致代码厌恶放弃。
标准(C ++ 98)表示,只以C状结构/语义破坏类型可以是一个联合的成员。 这涵盖了大部分的东西,这将使一类非-POD,所以只定义了一个联合型与A型的成员,编译器应该抱怨,如果A不POD。
有存在的方法调用的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:\
;\
}\
但doen't的命名空间限定的名称和专门的模板类型的工作。