我想将多种类型的元素存储在一个向量中,同时保持相同类型的元素连续。这些类型派生自一个基类,我希望在整个开发周期中实现不同的类型。出于这个原因,如果将新类型添加到列表中的过程非常简单,将会有所帮助。
我可以通过以下方式(在一定程度上)实现这一点:
//header
enum TypeID { TypeA_ID, TypeA_ID, TypeA_ID, TypeIDAmount };
vector<TypeA> vectorA;
vector<TypeB> vectorB;
vector<TypeC> vectorC;
//cpp
TypeBase* LookUp(TypeID type, int index)
{
switch(type)
{
case TypeA_ID: return (TypeBase*) &vectorA[index];
case TypeB_ID: return (TypeBase*) &vectorB[index];
case TypeC_ID: return (TypeBase*) &vectorC[index];
}
}
然而,这并不干净,易于维护,也不易于编译(保存数据的类包含在许多地方)。
一个更编译友好(但更丑陋)的选项我认为正在做这样的事情
//header
void* vectorArray;
//cpp
void Initialize()
{
vectorArray = new void*[TypeIDAmount];
vectorArray[0] = new vector<TypeA>;
vectorArray[1] = new vector<TypeB>;
vectorArray[2] = new vector<TypeC>;
}
TypeBase* LookUp(TypeID type, int index)
{
void* pTypedVector = &vectorArray[type];
switch(type)
{
case TypeA_ID: return (TypeBase*) (*(vector<TypeA>*)pTypedVector)[index];
case TypeB_ID: return (TypeBase*) (*(vector<TypeB>*)pTypedVector)[index];
case TypeC_ID: return (TypeBase*) (*(vector<TypeC>*)pTypedVector)[index];
}
}
(嗯!)
有什么可以像这样通用的吗?
vector< vector<?>* > vectorOfVariedVectors;
编辑:
这种结构的动机是在实体-组件设计模式中存储组件。
我希望类型(或者更确切地说,组件)是连续的的原因是能够以缓存友好的方式遍历它们。这意味着我希望实例本身是连续的。虽然使用连续指针会给我一个类似于我想要的行为,但如果它们指向内存中的“随机”位置,那么在获取它们的数据时仍然会发生缓存未命中。
避免内存碎片是一个很好的额外好处。
主要思想是拥有一个干净的管理器类型类来保存并提供对这些元素的访问。不希望有其他开发人员必须添加到此类的多个成员向量,只要这需要创建新类的用户来更改此管理器类。对此容器类的编辑应该尽可能简单,或者希望不存在。
找到解决方案
感谢 Dmitry Ledentsov 将我指向这篇文章。这几乎就是我想要的。