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?