我有一个类似 CRTP 的构造:
class Derived : public Base<Derived>
Derived
我需要通过 从指向对象的指针计算指向Base<Derived>
对象的指针reinterpret_cast
。我无法使用dynamic_cast
,因为我在这里没有使用虚函数。
类型已给出,我确实有指向Base<Derived>
对象的指针。我需要两种类型之间的字节偏移量,因此我可以使用reinterpret_cast
。我该怎么做(没有未定义的行为)?是否可以在编译时执行/保存为static constexpr
变量(我使用的是 C++20)?
无需进行偏移计算或
reinterpret_cast
。如果您确定该对象确实是一个
Derived
,那么您可以简单地使用static_cast
:请注意,如果
pBase
上面实际上没有指向Derived
对象,则static_cast
最后一行的使用将调用未定义行为(UB)。附注:
正如@BenVoigt在下面评论的那样,向CRTP基类添加一个辅助方法来完成这种转换是很常见的。
即添加类似这样的内容(如果需要,可以用实际的模板参数名称
Base<Derived>
替换):Derived
Base
CRTP 模式依赖于基类和派生类型之间的 static_cast<>。Derived 类类型是实例化的 Base 模板类型的唯一派生类。因此,可以保证
static_cast<Derived*>(this)
在模板类 Base 中是安全的。这就是为什么经常看到这样的代码:这里,
class obj
只需要实现基类的APIvalue()
,为中间基类class Inc
实现前置和后置增量运算符即可。(@wohlstad 得到了第一个答案,所以我想补充一些更详细的答案)