检查类是否具有期望的属性

Checking if a class has expected attributes

本文关键字:期望 属性 是否 检查      更新时间:2023-10-16

我将讲授一些关于c++和数据结构的课程,为了检查学生的进度,我希望他们能够开发我所谈论的结构。我想这是数据结构类的常用方法。但是我想要更多,我想让学生们对他们错过的东西有一个快速的反馈,所以我为这些类开发了几个单元测试,检查行为,并给他们提供错误的即时结果。

这在过去的两个学期里一直正常工作,但我想在自动更正上更进一步。我一直在研究如何检查一个类的内部组件是什么,这样我就可以知道是否有人正确地实现了一个具有node* rootsize_t size的树,并且没有使用额外的不必要的属性,例如。

我知道我可以有一个粗略的近似的对象大小与sizeof,但结果不是那么精确。它经常与我所期望的不同,例如:我测试创建一个具有指针(8字节)和int(4字节)的类,但是sizeof是28。据我所知,这可能与虚拟函数表和其他对齐的东西有关。

那么,如果有人以适当和预期的方式编码了数据结构,我能分析到什么程度?我怎么能检查有人只是没有#include <list>,并创建了一个适配器(为此,我知道我可以只是剥离包括,但无论如何)?

让我们把这个答案分成两部分,我们将在从is_standard_layout返回时分开。

<标题> 1。虚拟类

is_standard_layout将返回false,这意味着类是virtualvirtual类将包含其父类的所有成员,除了virtual函数指针。你可以在这里找到更多信息。基本上,在这里找到成员大小的最佳方法是执行sizeof,将相关类减少sizeof(void*),这就是virtual class成员的大小。

<标题> 2。非虚拟类

is_standard_layout将返回true,这意味着这不是virtual class。在这种情况下,我们可以使用offsetof来查找头信息后面的第一个成员变量。用指向对象和sizeof的指针找到对象的末端,可以测量到offsetof返回的点的距离。

这两种方法都应该产生类中成员的大小。确定班级规模的允许范围是个人偏好的问题。但是,将求值放在static_assert中还允许您提供一条编译时消息,指示断言的原因。