如何断言特定类在其布局中没有任何 vtbl 指针?

Posted

技术标签:

【中文标题】如何断言特定类在其布局中没有任何 vtbl 指针?【英文标题】:How to assert that a particular class does not have any vtbl pointers in its layout? 【发布时间】:2012-01-10 13:38:37 【问题描述】:

我有一个简单的 RAII 类来确保正确处理某些句柄。现在我想断言没有人会意外地向它添加任何虚拟方法。在我看来,我需要断言该类没有 vtbl 指针。

我该怎么做?是否可以在编译时断言?

编辑

我会满足于桌面编译器。据我所知,没有不使用 vtbl 实现多态性的桌面 c++ 编译器。

【问题讨论】:

理论上,你不能以便携的方式做到这一点。 您可能有兴趣获得 sealed 类:***.com/q/4712992/96780 vtbl 是一个实现细节。可能存在不使用调用表来实现虚函数的编译器。您想将自己限制在一个特定的编译器上吗? 我不确定我是否了解添加虚拟对象的危险是什么?当然,如果您的句柄是私有的,那么它是安全的,不是吗? 添加 virtual 会改变类的布局,在某些编译器中,vtbl 将是类的第一个成员,而出于各种原因,我需要句柄作为第一个成员。 【参考方案1】:

如果你有 C++11 库,可以使用std::is_polymorphic<T>:

如果 T 是多态类(即声明或继承至少一个虚函数的类),则提供等于 true 的成员常量值。对于任何其他类型,值为 false。

【讨论】:

+1,太好了!此外,如果您没有 C++11 而您有 Visual C++,则有 __is_polymorphic - msdn.microsoft.com/en-us/library/ms177194%28v=VS.90%29.aspx 不错。我希望他们在 C++11 中引入更多静态类型信息/反射功能(例如获取类的字段/方法列表的方法)。这将使为脚本语言创建一些元代码(如包装器)变得更加容易。 Boost.TypeTraits 也有这个,顺便说一句。 +1:有徽章。值得注意的是,这里我们可以完全忽略“vtables”的实现概念,而只关注具有虚函数的多态类。 我猜这种情况下不可能有编译时断言,对吧?

以上是关于如何断言特定类在其布局中没有任何 vtbl 指针?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测和断言特定类的虚拟继承?

sahi - 动态表

指针的内存布局

C++面向对象高级编程(下) 第二周笔记 GeekBand

悬停在其行上时如何更改特定表格单元格的颜色? [关闭]

当抛出的任何错误都没有冒泡时,如何在 Promise 中进行断言?