Проблемы с реализацией type_id без RTTI - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь вставить type_id в мой проект Arduino. Включение RTTI не вариант, но мне нужен способ определить тип объекта во время выполнения (и не более того).

Я прочитал много статей и постов StackOverflow по этому вопросу (и я буду администрировать, я не понимаю всего этого), но какой бы пример я ни пытался реализовать, он почему-то не выполняет то, что я хочу, что является возвращением type_id производного класса.

Базовый пример (на основе кода Акселя Мензеля) возвращает следующее:

Hello World а: 1 Би 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 голосов
/ 15 января 2019

Я решил это, добавив виртуальный метод, который переопределяется в каждом классе, который нуждается в идентификации типа. Для простоты кодирования я определил код, который должен повторяться в каждом классе в одном # 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...