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

你也可以使用自动化:

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

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

链接地址: http://www.djcxy.com/p/40301.html

上一篇: ness" in c++/c++11?

下一篇: lvalue and rvalue for pre/postfix increment