У меня есть такой класс:
class Component1 {...};
class Component2 {...};
class Component3 {...};
class Entity
{
Component1 c1;
Component2 c2;
Component3 c3;
public:
Component1& get_c1() { return c1;}
Component2& get_c2() { return c2;}
Component3& get_c3() { return c3;}
};
По сути, сущность - это контейнер всех возможных типов компонентов (вместе с другими вещами). Моя проблема в том, что у меня более 15 различных компонентов, и я не люблю копировать и вставлять строки таким образом.
Я ищу что-то вроде:
myEntity.get<Component1>();
для получения нужного мне компонента. Я взглянул на boost :: tuple, это круто, но позволяет получить доступ, используя целое число в качестве ключа. Я мог бы использовать общедоступное статическое целое число const в каждом классе Component * и получить доступ следующим образом:
myEntity.get<Component1::id>();
но тогда я должен убедиться, что для каждого компонента используются разные идентификаторы, и это плохо для обслуживания.
Есть ли способ «сопоставить» тип со значением этого типа, используя магию (то есть шаблоны), чтобы
myEntity.get<Component1>()
работает как положено?
Я также хотел бы иметь O (1) доступ к компоненту, поскольку myEntity::get<T>
используется очень часто (не то, что с 15-20 компонентами имеет смысл говорить о сложности в любом случае), но это не обязательно.