繁体   English   中英

在 c++/c++11 中测试“POD-ness”?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM