[英]Test for “POD-ness” in c++/c++11?
我有一些代码采用打包的 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 的技巧?
C++11 中的std::is_pod<A>::value
。
[编辑:请参阅上面 Luc 的评论,在 C++11 中,您不需要将类型设为 POD 来完成您正在做的事情。
就此而言,您也不需要强制转换为void*
,并且不必要地将 C 风格的指针强制转换为void*
有点冒险,因为有一天您会意外地抛弃const
!]
在 C++03 中,没有标准的方法可以做到这一点,但 Boost 有自己的is_pod
,它会在不提供非标准方法的编译器上谨慎行事。 因此,如果您正在编写 POD 特殊情况是优化的代码(您不会在任何地方都得到优化),它会很有用。 如果您只关心 Boost 可以得到准确答案的编译器,它也很有用。 如果is_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:\
;\
}\
但它不适用于命名空间限定名称和专用模板类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.