C++ 测试「;豆荚度“;在c++/c++;11?
我有一些代码,它采用打包的POD结构/类,并将其复制到内存块中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的可靠性。如果有人意外地将
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。非常感谢。这是一个非常有用的观察结果!它符合标准,并给出直接的错误消息。