我想使用下面的函数assign
,将未知类型的结构存储在存储在void指针中的特定内存地址上。这适用于某些结构(例如使用Test1
),但对于其他结构,它不起作用(例如使用Test2
)。不幸的是,我找不到任何类型结构的模式,因为它对某些POD和非POD结构起作用。
为了以这种方式存储结构,必须满足哪些条件?
#include <vector>
template <typename T>
void assign(void* p, T obj){
T* t = reinterpret_cast<T*>(p);
*t = obj;
}
struct Test1{
int i1;
int i2;
};
struct Test2{
std::vector<int> i;
};
int main()
{
void* p = new char[100];
Test1 test1;
test1.i1 = 0;
test1.i2 = 0;
Test2 test2;
test2.i = std::vector<int>();
assign(p, test1);
assign(p, test2);
delete[] p;
return 0;
}
修改
为什么我要这个?我目前正在实现一个使用实体组件系统模型的游戏引擎(一个实体是一个游戏对象,一个组件是它的一种属性,一个系统实现了修改组件的逻辑。)。有一个存储和管理实体的类(不出所料地称为EntityManager
)。一些使用我的引擎的程序员可以为实体定义组件(简单的结构,仅用于包含数据而不包含任何功能)。因此EntityManager
需要存储事先未知类型的对象。进一步的限制是组件应以有效的方式存储,即在存储器中彼此后面。这就是为什么一个简单的方法,比如拥有一个基类Component
然后有一个成员变量vector<vector<Component*>>
是不合适的。
我的解决方案是EntityManager
预先分配足够的空间来存储某个用户定义的最大实体数。然后可以使用上面的assign
函数存储给定的组件。