C++ 测试「;豆荚度“;在c++/c++;11?

C++ 测试「;豆荚度“;在c++/c++;11?,c++,c++11,types,C++,C++11,Types,我有一些代码,它采用打包的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的可靠性。如果有人意外地将

我有一些代码,它采用打包的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操作将变得无效,但仍然可以编译。这导致很难检测到bug

是否有一个Is-POD-type(a)函数,或者其他一些技巧可以用来在运行时或编译时检测PODness?

std::Is-POD::value
在C++11中

[编辑:参考上面Luc的评论,在C++11中,您不需要将类型设置为POD来完成所做的工作

因此,您也不需要强制转换到
void*
,而指向
void*
的C样式强制转换指针不必要地有一点风险,因为有一天您会意外地放弃
const
!]


在C++03中没有标准的方法,但是Boost有它自己的
is_pod
,对于没有提供非标准方法的编译器来说,这是一个错误。因此,如果您正在编写POD特例是优化的代码(您不会在任何地方都得到优化),那么它将非常有用。如果您只关心Boost可以得到准确答案的编译器,那么它也很有用。如果
的误判导致代码厌恶地放弃,那就不太好了。

标准(C++98)规定,只有具有类似C的构造/破坏语义的类型才能成为联合的成员。这涵盖了使类型成为非POD的大部分内容,因此只需定义一个具有类型a成员的联合类型,如果a不是POD,编译器就会抱怨。

存在一个调用std::tr1::is\u 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:\
        ;\
  }\

但是它不适用于名称空间限定名和专用模板类型。

请注意,在C++11中,一个类型可以简单地复制,以这种方式使用
memcpy
。这个属性的相关特性是
std::is_littley_copyable
,或者您可以使用
std::is_little
,它是一个超集(libstdc++已经实现了后者,但没有实现前者)。一个小点:POD类可以包含非虚拟成员函数(和静态成员函数)。天哪,我喜欢stackoverflow。非常感谢。这是一个非常有用的观察结果!它符合标准,并给出直接的错误消息。