【发布时间】:2016-09-03 03:08:02
【问题描述】:
我的实体组件系统中有这张地图:
std::map<u_int32_t, std::vector<std::shared_ptr<Component>>> _componentMap;
u_int32_t 是组件向量的关键。同一个组件可以有多个实例。 (这就是为什么有一个向量)。
现在我想要一个模板化的 getter 函数,它返回一个继承类型的 Vector:
template<class T> inline const std::vector<std::shared_ptr<T>> & getVector() const
{
u_int32_t key = getKey<T>();
return static_cast<std::vector<std::shared_ptr<T>>>(_componentMap.count(key) ? _componentMap.at(key) : _emptyComponentVec);
}
我知道这不起作用,因为不同类型的std::vectors 完全不相关,我无法在它们之间进行转换。我还想避免每次调用这个函数时分配一个新的向量。
但是我怎样才能得到想要的行为呢?添加组件后,我可以创建所需派生类型的std::vector。
问题也可能是:我怎样才能拥有一个包含不同类型std::vector 的std::map?
对于我无法链接到 boost 的任何解决方案,但如果绝对需要,我可以集成 boost 的单个标头。
【问题讨论】:
-
想知道
std::tuple<std::vector<std::shared_ptr<TComponents>>...>是否更合适。 -
抱歉,您能再解释一下吗?我不是 C++ 专家。我用过元组,但我不知道他们会如何解决它。如果可行,我也愿意更改我的数据结构。
-
我的意思是,类似于that。
-
啊,我明白了,但这需要在初始化时命名所有可能的组件......这也不是很理想。
-
如果你可以使用一些范围库,你可以做一个*视图*或你的组件向量而不分配。
标签: c++ c++11 dictionary vector stl