Как эффективно генерировать RTTI

Я пытаюсь построить система сущностей. Каждый объект имеет набор связанных с ним компонентов, и каждый компонент имеет уникальный тип. Все компоненты являются производными от базового класса компонентов.

Мне нужно создать класс add / remove / get Component, который каким-то образом принимает тип компонента в качестве переменной (то есть с использованием шаблонов). Проверка типа компонента каждый раз, когда они вызываются, например, с помощью typeid неэффективно, поэтому мне нужно сгенерировать идентификатор для каждого производного класса компонента. В других постах здесь я видел, как это делается несколькими способами, включая использование CRTP и использование некоторой шаблонной функции, которую нужно вызывать каждый раз, когда вы определяете производный класс.

Моя проблема с этими методами (которая в основном является личной) заключается в том, что вам нужно как минимум добавить какой-то комментарий, чтобы уведомить любого, кто может быть заинтересован в создании нового класса Component, что он должен использовать один из указанных выше методов, то есть требование явно не виден в самом коде.

Таким образом, я ищу метод, который как-то чисто обрабатывает сохранение RTTI без применения каких-либо специальных правил для кого-то, кто хочет потенциально использовать систему сущностей.

В качестве примера, мой лучший вариант — просто проверить тип в addComponent функция. Это делается с помощью функции шаблона, которая считает уникальные классы и возвращает идентификатор для этого класса, т.е.


extern int component_id_count;
int component_id_count = 0;
template <class T>
int getComponentID(void){
static int id = component_id_count++;
return id;
}

Затем он проверяет, больше ли идентификатор, чем последний встреченный идентификатор. Если это так, встречается новый тип компонента, и его необходимо зарегистрировать. Это может быть довольно эффективным, если addComponent не вызывается много раз. Но я все еще должен задаться вопросом, есть ли более эффективный подход к тому, чего я хочу достичь.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …