-->

测试在C“POD性” ++ / C ++ 11?(Test for “POD-ness” in c+

2019-09-22 01:32发布

我有一些代码,这需要填充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在运行时或编译时的一些其他的把戏?

Answer 1:

std::is_pod<A>::value在C ++ 11。

[编辑:指吕克的评论以上,在C ++ 11,你不需要类型为POD为你在做什么。

对于这个问题,你也不必强制转换为void* ,和C风格的铸造指针void*不必要是一点点的风险,因为有一天你会抛弃const意外!]

在C ++ 03有做到这一点没有标准方法,但升压都有自己is_pod是谨慎的侧抱错编译器不提供非标准的方式找出来。 所以,如果你正在写的代码,其中POD特殊情况,是一个优化是非常有用的(你是不会得到优化无处不在)。 这也是有用的,如果你只关心编译器,其升压能得到一个准确的答案。 如果假阴性由这不是那么好is_pod导致代码厌恶放弃。



Answer 2:

标准(C ++ 98)表示,只以C状结构/语义破坏类型可以是一个联合的成员。 这涵盖了大部分的东西,这将使一类非-POD,所以只定义了一个联合型与A型的成员,编译器应该抱怨,如果A不POD。



Answer 3:

有存在的方法调用的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:\
        ;\
  }\

但doen't的命名空间限定的名称和专门的模板类型的工作。



文章来源: Test for “POD-ness” in c++/c++11?