在没有RTTI的情况下实现type_id的问题

时间:2019-01-14 21:36:47

标签: c++ arduino

我正试图将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;
}

1 个答案:

答案 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