6

我有一些代码采用打包的 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-ness。如果有人不小心将成员函数添加到此类,则 memcpy 操作将变为无效,但仍可编译。这导致非常难以检测错误。

是否有 is_POD_type(A) 函数或其他可用于在运行时或编译时检测 POD 的技巧?

4

3 回答 3

14

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

[编辑:请参阅上面 Luc 的评论,在 C++11 中,您不需要将类型设为 POD 即可。

就此而言,你也不需要强制转换为void*,而 C 风格的强制转换指针void*不必要地有点冒险,因为有一天你会const意外地抛弃!]

在 C++03 中没有标准的方法可以做到这一点,但是 Boost 有自己is_pod的错误,因为编译器不提供非标准的查找方法。因此,如果您正在编写 POD 特殊情况是优化的代码(您不会在任何地方都得到优化),那么它会很有用。如果您只关心 Boost 可以得到准确答案的编译器,它也很有用。如果误报is_pod导致您的代码厌恶地放弃,那就不是很好了。

于 2012-09-02T01:31:41.643 回答
4

标准 (C++98) 说只有具有类似 C 的构造/破坏语义的类型才能成为联合的成员。这涵盖了使类型成为非 POD 的大部分内容,因此只需使用类型 A 的成员定义一个联合类型,如果 A 不是 POD,编译器应该会抱怨。

于 2012-09-02T02:02:12.763 回答
0

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

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

于 2013-06-17T07:01:27.653 回答