在 c++/c++11 中测试“POD-ness”?
Posted
技术标签:
【中文标题】在 c++/c++11 中测试“POD-ness”?【英文标题】:Test for "POD-ness" in c++/c++11? 【发布时间】:2012-08-27 07:11:54 【问题描述】:我有一些代码采用打包的 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) 函数或其他可用于在运行时或编译时检测 POD 的技巧?
【问题讨论】:
is_pod 请注意,在 C++11 中,以这种方式使用memcpy
的类型可以简单地复制就足够了。此属性的关联特征是std::is_trivially_copyable
,或者您可以使用std::is_trivial
,它是一个超集(libstdc++ 已经实现了后者,但没有实现前者)。
一个小问题:POD 类允许包含非虚拟成员函数(和静态成员函数)。
【参考方案1】:
std::is_pod<A>::value
在 C++11 中。
[编辑:请参阅上面 Luc 的评论,在 C++11 中,您不需要将类型设为 POD。
就此而言,您也不需要强制转换为void*
,并且不必要地将C 风格的指向void*
的强制转换指针有点冒险,因为有一天您会意外地抛弃const
! ]
在 C++03 中没有标准的方法可以做到这一点,但是 Boost 有自己的is_pod
,对于不提供非标准查找方法的编译器,请谨慎行事。因此,如果您正在编写 POD 特殊情况是优化的代码(您不会在任何地方都得到优化),那么它会很有用。如果您只关心 Boost 可以得到准确答案的编译器,它也很有用。如果is_pod
的误报导致您的代码厌恶地放弃,那就不好了。
【讨论】:
天哪,我喜欢 ***。谢谢你。 std::is_god【参考方案2】:标准 (C++98) 规定,只有具有类 C 构造/破坏语义的类型才能成为联合的成员。这涵盖了使类型成为非 POD 的大部分内容,因此只需使用类型 A 的成员定义一个联合类型,如果 A 不是 POD,编译器应该会报错。
【讨论】:
这是一个非常有用的观察!它符合标准并提供直接的错误消息。【参考方案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:\
;\
\
但它不适用于命名空间限定名称和专用模板类型。
【讨论】:
以上是关于在 c++/c++11 中测试“POD-ness”?的主要内容,如果未能解决你的问题,请参考以下文章