c++ - 在没有 RTTI 的情况下模拟动态转换

标签 c++ casting rtti

在一个简单的嵌入式平台上,我没有可用的 RTTI,但我想使用 C++ 的优势,例如对提供的示例等类层次结构的继承。目前我正在使用下面的代码来模拟动态转换。为了简化这个讨论,我将代码移植到一个简单的 main.cpp 中。我使用 mingw 编译器来测试我的示例。代码按预期工作,但接缝不理想。考虑到所有方面,我不是在寻找通用的动态类型转换替换解决方案。有没有什么办法可以更轻松地实现这个类型转换?

class I_BC
{
public:
    virtual ~I_BC() {}
    virtual int getI_BC() = 0;
};

class I_C
{
public:
    virtual ~I_C() {}
    virtual int getI_C() = 0;
};

class A
{
public:
    virtual ~A() {}
    int xx() {return 1;}

    template <typename T>
    T* cast() { return nullptr;}

protected:
    virtual I_BC* cast2BC() {return nullptr;}
    virtual I_C* cast2C() {return nullptr;}
};

template <>
I_BC* A::cast<I_BC>()  {return this->cast2BC();}
template <>
I_C* A::cast<I_C>()  {return this->cast2C();}

class B : public A, public I_BC
{
public:
    int getI_BC() override  { return 0xB000000C;}
    int bar() {return 2;}

protected:
    I_BC* cast2BC() override {return this;}
};

class C : public A, public I_BC, public I_C
{
public:
    int foo() {return 3;}
    int getI_C() override   { return 0xC000000C;}
    int getI_BC() override  { return 0xC00000BC;}

protected:
    I_BC* cast2BC() override {return this;}
    I_C* cast2C() override {return this;}
};


#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
    A* a = new B();

    // Ok I know that B implement I_BC interface so cast it now
    I_BC* bc = a->cast<I_BC>();
    cout << "Res : 0x" << hex << bc->getI_BC() << endl;

}

最佳答案

这是一个自定义的 RTTI 实现,它使用宏来减少样板代码:
https://www.axelmenzel.de/articles/rtti

关于c++ - 在没有 RTTI 的情况下模拟动态转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63341631/

相关文章:

c++ - 构造函数参数默认值的链接器问题

c++ - 重载类型转换运算符,转换为指向函数的指针

c++ - 在遗留代码上规避 RTTI

c++ - 在关闭 RTTI 的情况下 boost 简单类的序列化 (-fno-rtti)

c++ - 将 `this` 作为 shared_ptr 传递给函数

C++ 基本构造函数/vector 问题(1 个构造函数,2 个析构函数)

c++ - 即使 imshow 有效,也无法写入 PNG

c# - 装箱/拆箱 - 只有值类型? Ref.types - 类型转换?

c++ - 不寻常的 static_cast 语法

c++ - RTTI(运行时类型信息)是否用于静态转换?