使用模板类分配任意数量的参数

时间:2017-09-15 19:44:05

标签: c++ c++11 object-pooling

我想实现一个简单的模板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);

}

2 个答案:

答案 0 :(得分:1)

如果使用C ++ 11及更高版本,要实现add_new_way方法,可以使用可变参数模板参数和转发:

template <typename... Args>
void add_new_way(Args... args) {
  mObjects.emplace_back(std::forward<Args>(args)...);
}

然后调用代码可以:

v.add_new_way(arg1, arg2, ..., argN);

答案 1 :(得分:1)

利用移动语义和完美转发使分配变得便宜:

template <typename... Args>
void add_new_way(Args&&... args)
{
    mObjects[nextFreeIndex] = T{std::forward<Args>(args)...};
}

Live on Coliru

由于分配的对象是临时对象,因此如果存在,将调用分配给的对象的移动赋值运算符。这将使对象将任何昂贵的复制资源的所有权从临时转移到池中的对象。

如需进一步阅读,请查看以下问题:What are move semantics?