【发布时间】:2017-09-15 19:44:04
【问题描述】:
我想实现一个简单的模板 ObjectPool 类。 它有一个固定大小的向量作为成员变量,这些元素在创建时默认初始化。 这已经完成并且工作正常。
问题是将新元素分配给成员向量的最佳方法是什么?
我实现了add_old_way 成员函数,它能够向ObjectPool 添加任何类型的数据,并且工作正常。 我唯一的问题是我创建了一个额外的对象,并将其传递给该函数,而在内部,我只是在分配后将其丢弃。如果我们谈论的是巨型类,那就是浪费资源。
我应该如何实现 add_new_way 函数,该函数能够接受任意参数并将它们单独分配给向量元素?
请注意,ObjectPool 是模板化的,因此任何类型的类都可以是它的类型,而不仅仅是下面示例中的 Bar 或 Matrix2x2。
我现在还没有关键字可以在互联网上查找它,如果可能的话也没有。
谢谢!
template <class T>
class ObjectPool
{
vector<T> mObjects;
ObjectPool() : mObjects(size)
{
}
//that's what i could come up with to add an object to the object pool
void add_old_way(const T& object)
{
...
mObjects[nextFreeIndex] = object;
...
}
//desired way of adding object
void add_new_way(...)
{
mObjects[nextFreeIndex].param1 = param1;
mObjects[nextFreeIndex].param2 = param2;
...
mObjects[nextFreeIndex].paramN = paramN;
}
};
class Bar
{
Bar(int x, string s)
{
mX = x;
mS = s;
}
int mX;
string mS;
};
int main()
{
ObjectPool<Bar> v;
ObjectPool<Matrix2x2> v;
//that's what i could come up with
v.add_old_way(cBar(1,"asdf"));
v.add_old_way(cMatrix2x2(1,2,3,4));
//desired way of adding object
v.add_new_way(1,"asdf");
v.add_new_way(1,2,3,4);
}
【问题讨论】:
-
您希望它的行为类似于来自
std::vector的emplace_back? -
@Justin 我刚才查了一下,不知道。是的,类似的东西,甚至查看了源代码,但只是不明白这些任意数量的参数是如何处理和单独分配的。
-
OT:如果向量是固定大小的,
std::array呢?
标签: c++ c++11 object-pooling