在void指针中存储未知类型的c ++结构 - 需要什么结构属性?

时间:2017-10-28 23:24:16

标签: c++ memory struct game-engine

我想使用下面的函数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函数存储给定的组件。

0 个答案:

没有答案