C++ 创建不同模板化对象的模板化数组的模板化数组

C++ 创建不同模板化对象的模板化数组的模板化数组,c++,templates,arrayofarrays,C++,Templates,Arrayofarrays,嘿,我目前正在开发一个非常简单的ecs,我想将我所有的组件存储在一个更大的阵列中,其中有不同类型的阵列,也有不同类型的阵列。 像这样: ComponentArray组件; 现在我了解了这一点,显然我必须为ComponentArray以及Component创建一个基类,并让MainArray具有指向基类的指针。 所以我认为宣言应该是这样的: ComponentArray组件; 在另一个实现文件中的初始化中(因为它是一个静态类,并且具有模板成员函数,所以我必须将实现设置为.inl文件,并且不能在

嘿,我目前正在开发一个非常简单的ecs,我想将我所有的
组件
存储在一个更大的阵列中,其中有不同类型的阵列,也有不同类型的阵列。 像这样:

ComponentArray>组件;
现在我了解了这一点,显然我必须为
ComponentArray
以及
Component
创建一个基类,并让
MainArray
具有指向基类的指针。 所以我认为宣言应该是这样的:

ComponentArray*>组件;
在另一个实现文件中的初始化中(因为它是一个静态类,并且具有模板成员函数,所以我必须将实现设置为
.inl
文件,并且不能在那里初始化数组):

ComponentArray*>ComponentManager::components{/*在这里创建一些数组*/};
我的数组类如下所示:

模板
结构组件阵列基{};
模板
结构ComponentArray:ComponentArrayBase
{
ComponentType数组[maxEntitys];
ComponentType和运算符[](无符号整数索引)
{
返回数组[索引];
}
};
我的
组件
如下所示:

struct ComponentBase{};
结构位置组件:ComponentBase
{
//一些成员变量
};
我想在哪里使用它,例如:

模板
ComponentType&ComponentManager::getComponent(实体e,无符号字符索引)
{
返回*(*(组件[索引][e]);
}
编译时出现以下错误:

错误:“运算符*”不匹配(操作数类型为“ComponentArrayBase”)
返回*(*(组件[componentArray])[e]);
我不确定我说的话是否都有道理,所以非常感谢你的回答


Che

为什么要为组件阵列使用特殊类型?它在标准库容器(如
std::vector
)上添加了什么功能?我需要一个围绕数组的包装器,以便让包装器继承基类,以便将不同类型的数组放入一个更大的数组中。在包装器中,我不想使用std::vector,因为这样我就失去了快速遍历数组的许多优势。我可以使用std::array,但我看不出任何原因,因为我只需要对它进行索引,什么都不需要。@Che“不想使用std::vector,因为这样我就失去了快速迭代数组的许多优点”嗯?在
std::vector
上迭代速度最快。你在说什么?好吧,但我不需要向量,因为我不想动态分配内存。我只需要一个固定大小的数组,不需要任何额外的花哨东西。
std:array
是一个更简单的解决方案,如果您想检查边界,可以使用
.at()
。它是C++11和
std::array
的完美组合。为什么要为组件数组指定一种特殊类型?它在标准库容器(如
std::vector
)上添加了什么功能?我需要一个围绕数组的包装器,以便让包装器继承基类,以便将不同类型的数组放入一个更大的数组中。在包装器中,我不想使用std::vector,因为这样我就失去了快速遍历数组的许多优势。我可以使用std::array,但我看不出任何原因,因为我只需要对它进行索引,什么都不需要。@Che“不想使用std::vector,因为这样我就失去了快速迭代数组的许多优点”嗯?在
std::vector
上迭代速度最快。你在说什么?好吧,但我不需要向量,因为我不想动态分配内存。我只需要一个固定大小的数组,不需要任何额外的花哨东西。
std:array
是一个更简单的解决方案,如果您想检查边界,可以使用
.at()
。它是C++11和
std::array
的完美结合。