Я пытаюсь построить система сущностей. Каждый объект имеет набор связанных с ним компонентов, и каждый компонент имеет уникальный тип. Все компоненты являются производными от базового класса компонентов.
Мне нужно создать класс 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
не вызывается много раз. Но я все еще должен задаться вопросом, есть ли более эффективный подход к тому, чего я хочу достичь.
Задача ещё не решена.
Других решений пока нет …