我正试图将type_id放入我的Arduino项目。不能启用RTTI,但我需要一种在运行时确定对象类型的方法(仅此而已)。
我已经阅读了很多文章和关于StackOverflow的文章(并且我将不了解所有内容),但是无论我尝试实现什么示例,它都无法实现我想要的结果,这就是回报派生类的type_id。
基础示例(基于Axel Menzel的代码)返回以下内容:
Hello World a:1 b:2 b2:1
我不明白为什么b2返回1。 有人可以帮我一下吗?
#include <iostream>
using namespace std;
static int generateId()
{
static int typeID; // automatically init with 0
return ++typeID;
}
template <typename T>
struct MetaTypeInfo
{
static int getTypeInfo()
{
static const int typeID = generateId();
return typeID;
};
};
class ClassA {
public:
virtual ~ClassA() {};
static MetaTypeInfo<ClassA> typeinfo;
};
class ClassB: public ClassA {
public:
virtual ~ClassB() {};
static MetaTypeInfo<ClassB> typeinfo;
};
int main()
{
cout << "Hello World" << endl;
ClassA a;
ClassB b;
ClassA* b2 = new ClassB();
cout << "a: " << a.typeinfo.getTypeInfo() << endl;
cout << "b: " << b.typeinfo.getTypeInfo() << endl;
cout << "b2: " << b2->typeinfo.getTypeInfo() << endl;
return 0;
}
答案 0 :(得分:0)
我通过添加一个虚拟方法解决了该问题,该方法在每个需要类型标识的类中都被覆盖。为了简化编码,我定义了应该在每个类中的#define中重复的代码。
欢迎提出任何改进建议
#include <iostream>
using namespace std;
static type_id generateId()
{
static int typeID; // automatically init with 0
return ++typeID;
}
template <typename T>
struct MetaTypeInfo
{
static int getTypeInfo()
{
static const int typeID = generateId();
return typeID;
};
};
#define TYPEINFO(T) \
static int getClassTypeId() { \
return typeinfo.getTypeInfo(); \
} \
virtual int getTypeId() { \
return typeinfo.getTypeInfo(); \
} \
static MetaTypeInfo<T> typeinfo
class ClassA {
public:
virtual ~ClassA() {};
TYPEINFO(ClassA);
int i = 0;
};
class ClassB: public ClassA {
public:
virtual ~ClassB() {};
TYPEINFO(ClassB);
};
int main()
{
ClassA a;
ClassB b;
ClassA* b2 = new ClassB();
cout << "A: " << ClassA::getClassTypeId() << endl;
cout << "B: " << ClassB::getClassTypeId() << endl;
cout << "a: " << a.getTypeId() << endl;
cout << "b: " << b.getTypeId() << endl;
cout << "b2: " << (b2)->getTypeId() << endl;
return 0;
}
此输出为:
$main
A: 1
B: 2
a: 1
b: 2
b2: 2