在 c++/c++11 中测试"POD-ness"?
Test for "POD-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
的假阴性导致您的代码厌恶地放弃,那就不太好了。
标准(C++98)规定,只有具有类C构造/销毁语义的类型才能成为联合的成员。这涵盖了使类型成为非POD的大部分内容,所以只需定义一个具有类型a成员的并集类型,如果a不是POD,编译器就会抱怨。
存在一个调用std::tr1::is_pod 的方法
你也可以使用类似于:的cicle
#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++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 数据成员SFINAE的C++17测试:gcc vs clang
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么二进制搜索在我的测试中不起作用
- 从父数组测试用例构造二叉树失败
- 试图对缓存进行跨步测试,但程序并没有结束
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- OpenGL在启用深度测试时不会丢弃我的碎片
- 为测试目标创建具有不同源文件夹的文件
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- VC++本机单元测试,找不到调试符号
- 换位表导致测试失败(但在游戏中运行良好)
- 用于交叉编译和CMake的预处理器宏的单元测试
- 谷歌测试中的期望值存储在哪里
- 如何在for循环中包含两个索引值的测试条件
- 带有嵌套结构/类的 POD-ness
- 在 c++/c++11 中测试"POD-ness"?