如何断言特定类在其布局中没有任何 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 指针?的主要内容,如果未能解决你的问题,请参考以下文章