Я перерабатываю Entity Manager системы компонентов Entity. Поскольку компоненты не имеют перекрывающихся функциональных возможностей, я не хочу, чтобы у них была общая база, которую я мог хранить.Следите за экземплярами шаблонов C++
Так я придумал что-то вроде этого:
#include <vector>
#include <memory>
#include <iostream>
class Component1{};
class Component2{};
class Component3{};
class Manager{
public:
template<typename T> static std::vector<std::shared_ptr<T>> component;
template<typename T> static std::shared_ptr<T> getComponent(int nth){
return component<T>[nth];
}
template<typename T> static std::shared_ptr<T> addComponent(int nth){
return component<T>[nth] = shared_ptr<T>(new T());
}
static void addEntity(){
// push back a nullptr for every instantiated component<>
}
static void removeEntity(int nth){
// set the nth index of every component<> to nullptr
}
};
template<typename T>
std::vector<std::shared_ptr<T>> Manager::component = std::vector<std::shared_ptr<T>>();
int main(){
Manager::component<Component1>;
Manager::component<Component2>;
Manager::component<Component3>;
Manager::addEntity();
auto cmp2 = Manager::getComponent<Component2>(0);
Manager::removeEntity(0);
std::cin.get();
return 0;
}
Как я могу перебрать конкретизированные компоненты для двух функций? Пробовал использовать вектор type_info для хранения типов Component, но я никогда не мог получить правильный тип из них для использования в качестве аргумента шаблона.