没有 RTTI 的 dynamic_cast

Jac*_*ack 4 c++ dynamic-cast multiple-inheritance rtti c++14

我有如下结构:

struct managed_object {
  virtual ~managed_object() { }
};

class trait1 {
  public: 
    virtual void myMethod() const = 0;
};

class trait2 {
  public: 
    virtual void myOtherMethod(int x) const = 0;
};

class MyType final : public managed_object, public trait1 {
 ...
};

class MyType2 final : public managed_object, public trait1, public trait2 {
 ...
};

class wrapper {
  private:
    managed_object* ptr;
  public:
    template<typename T> T* object() const { 
      return dynamic_cast<T*>(data.ptr); 
    }
};
Run Code Online (Sandbox Code Playgroud)

所以基本上我有一个managed_object基类,多个类型从中继承。这些子类型中的每一个都可以从特征的任意组合中继承,final因此我确信它们不会有更深层次的继承。

该代码的工作归功于 RTTI,它承担了将所有东西粘合在一起的负担,但要付出代价,否则

wrapper w = ...
trait* asTrait1 = w.object<trait1>;
Run Code Online (Sandbox Code Playgroud)

不会起作用,因为managed_objecttrait1类型之间没有直接关系。

在我的完整代码中,我已经确定一切dynamic_cast都不会失败,因为我有额外的数据(示例中未显示),它为我提供了一种代码其他部分所需的 RTTI。

鉴于此,假设我已经知道一个类是从特定的继承而来的,是否有一种通用模式可以在不使用和 RTTI 的情况下解决侧面向下转换问题?我试图找到一个聪明的解决方案,因为它是代码的一个严重瓶颈。dynamic_castMyTypetrait

Jes*_*uhl 5

不能使用dynamic_cast没有RTTI。除了少数极端情况。

可以使用static_castreinterpret_cast(请不要),虽然,但随后它在,如果你弄错了-那么你可以测试不再nullptr如果中投得手看