在一个简单的嵌入式平台上,我没有可用的 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/