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

Arbitrary number of parameter assignment with template class

本文关键字:任意数 参数 分配      更新时间:2023-10-16

我想实现一种简单的模板对象池类。它具有固定的大小向量作为成员变量,在创建时默认将元素的变量默认。这已经完成并且工作正常。

问题是将新元素分配给成员向量的最佳方法是什么?

i实现 add_old_way 成员函数,能够将任何类型的数据添加到ObjectPool中,并且工作正常。我唯一的问题是,我创建了一个我传递给该功能的额外对象,在内部,我只是在分配后将其扔掉。浪费资源,如果我们谈论巨型课程。

我应该如何实现 add_new_way 函数,该功能能够采用任意参数并分别分配给向量元素?

请注意,对Objectpool进行了模板,以便任何类型的类型,而不仅仅是bar或matrix2x2,如下面的示例。

我现在不前夕在这里的关键词在Internet上查找它,如果可能的话,

谢谢!

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);
}

使用移动语义和完美的转发来使作业便宜:

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

生活在coliru

由于要分配的对象是临时的,因此,如果存在的对象的移动分配操作员将被调用。这将使对象将任何昂贵的副本资源的所有权从临时资源转移到池中的对象。

要进一步阅读,请看一下这个问题:什么是移动语义?

如果使用C 11及更高版本,则可以使用add_new_way方法,您可以使用variadic模板参数并转发:

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

然后调用代码可以做:

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