检查类是否具有期望的属性
Checking if a class has expected attributes
我将讲授一些关于c++和数据结构的课程,为了检查学生的进度,我希望他们能够开发我所谈论的结构。我想这是数据结构类的常用方法。但是我想要更多,我想让学生们对他们错过的东西有一个快速的反馈,所以我为这些类开发了几个单元测试,检查行为,并给他们提供错误的即时结果。
这在过去的两个学期里一直正常工作,但我想在自动更正上更进一步。我一直在研究如何检查一个类的内部组件是什么,这样我就可以知道是否有人正确地实现了一个具有node* root
和size_t size
的树,并且没有使用额外的不必要的属性,例如。
我知道我可以有一个粗略的近似的对象大小与sizeof
,但结果不是那么精确。它经常与我所期望的不同,例如:我测试创建一个具有指针(8字节)和int(4字节)的类,但是sizeof
是28。据我所知,这可能与虚拟函数表和其他对齐的东西有关。
那么,如果有人以适当和预期的方式编码了数据结构,我能分析到什么程度?我怎么能检查有人只是没有#include <list>
,并创建了一个适配器(为此,我知道我可以只是剥离包括,但无论如何)?
让我们把这个答案分成两部分,我们将在从is_standard_layout
返回时分开。
is_standard_layout
将返回false
,这意味着类是virtual
。virtual
类将包含其父类的所有成员,除了virtual
函数指针。你可以在这里找到更多信息。基本上,在这里找到成员大小的最佳方法是执行sizeof
,将相关类减少sizeof(void*)
,这就是virtual class
成员的大小。
is_standard_layout
将返回true
,这意味着这不是virtual class
。在这种情况下,我们可以使用offsetof
来查找头信息后面的第一个成员变量。用指向对象和sizeof
的指针找到对象的末端,可以测量到offsetof
返回的点的距离。
这两种方法都应该产生类中成员的大小。确定班级规模的允许范围是个人偏好的问题。但是,将求值放在static_assert
中还允许您提供一条编译时消息,指示断言的原因。
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- C++概念:如何使用'concept'检查模板化结构的属性?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 通过指向指针数组的指针访问子类的属性
- MSVC是否支持C++11样式的属性而不是__declspec
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 类的C++属性似乎已重新初始化
- Qt Quick-如何仅从c++代码与qml属性交互
- 用概念检查属性的类型
- C++如何将同一类的实例作为属性
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 按多个属性排序
- 主函数参数的属性
- "perf_event_attr"结构的"read_format"属性的选项到底是什么?
- C++删除未使用的类属性会导致 std::logic_error
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 使用内存地址访问结构的属性值
- 一元*运算符的操作数是否期望一个 prvalue
- C++调用具有 *this 属性的单个帮助程序函数
- 检查类是否具有期望的属性