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

Test for "POD-ness" in c++/c++11?

本文关键字:POD-ness 测试 c++ c++11      更新时间:2023-10-16

我有一些代码,它采用打包的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的假阴性导致您的代码厌恶地放弃,那就不太好了。

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

存在一个调用std::tr1::is_pod 的方法

你也可以使用类似于:的cicle

#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:
        ;
  }

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