具有虚拟继承的编译时子类字节偏移量

Compile time subclass byte-offset with virtual inheritance

是否可以在编译时计算继承层次结构中虚基的字节偏移量?

例子-

class A {};
class B : public virtual A {};
class C : public virtual A {};
class D : public virtual B, public virtual C {};

我想计算 BCD w.r.t 实例的字节偏移量。 A 在编译时 即不使用这些 类.

的任何 真实 实例

根据我目前在网上阅读的内容,编译器在虚拟 table 的帮助下实现逻辑(由 static_cast 和 dynamic_cast 使用)并且因为没有 true 这些 类 中任何一个的实例都没有虚拟 table 可以搭载。但希望有一些模板魔法可以使这项工作成功。

目的 - 我试图让这个 Custom RTTI 实现与虚拟继承一起工作。

Is it possible to compute, at compile time, the byte offset of a virtual base in an inheritance hierarchy?

不是,因为不同的对象实例是不同的。它不是 class 的 属性。

让我们看看你的例子。 B 有一个虚拟基地 class A。所以 B 必须有一些字节偏移到 AC.

也是如此

但是,D 通过 BC 继承了虚拟 Avirtual 继承的全部意义在于,如果您继承相同的基 class,那么到达该基 class 的所有路径都将引用 相同的子对象 的动态类型。所以 D 只有一个 A.

的实例

但是它在哪里呢? BC 使用的偏移量不可能 是正确的。除非...偏移量本身存储在vtable中。

虚拟继承(基本上)是这样工作的。当您创建 D 时,D 负责分配所有 virtually 继承的对象的位置。这些偏移量将不同于您创建动态类型为 BC.

的对象时的偏移量

没有办法做你想做的事。并非没有实际创建对象的实例。虽然 C++20 确实允许您在编译时创建虚拟类型的实例(只要它们具有可行的 constexpr 构造函数,所以您不能对所有事情都这样做),您仍然不能做您想要的需要。如果您有指向两种不同类型的指针,要计算它们之间的字节偏移量,您必须 reinterpret_cast 将这些指针转换为整数或 unsigned char*reinterpret_cast 在编译时被禁止(当给定指针类型或包含指针的类型时,bit_cast 不是 constexpr)。