Время компиляции сгенерированный идентификатор типа константы

0

Я пишу систему событий как часть хобби проекта, 2D-движок игры. В рамках дизайна системы событий мне нужно сопоставить объекты в базе того, что шаблонный производный класс, который они представляют. Чтобы лучше проиллюстрировать проблему, рассмотрите следующий упрощенный код:

class Base
{
public:
    virtual ~Base(){};
    int getTypeId() {return typeId_;}
    static bool compareIfSameType(Base *a, Base *b)
        {return a->getTypeId() == b->getTypeId();}
protected:
    int typeId_;
};

template<typename T>
class Derived : public Base
{
public:
    Derived(int typeId) {typeId_ = typeId;}
};

int main()
{
    Derived<int> obj1(1);
    Derived<float> obj2(2);
    Derived<float> obj3(2);

    if(Base::compareIfSameType(&obj1, &obj2))
         cout << "obj1 and obj2 are of equal type\n";
    else cout << "obj1 and obj2 are not of equal type\n";
    if(Base::compareIfSameType(&obj2, &obj3))
         cout << "obj2 and obj3 are of equal type\n";
    else cout << "obj2 and obj3 are not of equal type\n";
}
/*output:
obj1 and obj2 are not of equal type
obj2 and obj3 are of equal type*/

Нет реальной проблемы с этим кодом, но требование вручную передать число, идентифицирующее тип каждого экземпляра производного класса, очень громоздко и подвержено ошибкам. Я хочу, чтобы автоматически генерировать typeId из типа T во время компиляции:

Derived<int> obj1;
Derived<float> obj2;
Derived<float> obj3;

if(Base::compareIfSameType(&obj1, &obj2))
    //do something...
Теги:
templates

1 ответ

1
Лучший ответ

Отбросив вопрос о мудрости дизайна, который требует сравнения типа для равенства, вы можете сделать это с помощью typeid. Не нужно писать самостоятельно. Base* a и Base* b указывают на объекты, которые имеют один и тот же производный тип, если typeid(*a) == typeid(*b).

  • 0
    Это будет работать, но это идентификация типа во время выполнения, и сгенерированная константа времени компиляции будет достаточной.
  • 0
    Конечно да. Вся информация typeid генерируется компилятором при компиляции программы. Если вы имеете в виду что-то еще под «сгенерированным во время компиляции», вам нужно точно объяснить, каковы ваши требования.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню