C++ 使用模板类指定任意数量的参数

C++ 使用模板类指定任意数量的参数,c++,c++11,object-pooling,C++,C++11,Object Pooling,我想实现一个简单的模板ObjectPool类。 它有一个固定大小的向量作为成员变量,这些元素在创建时默认初始化。 已经完成了,效果很好 问题是,将新元素指定给成员向量的最佳方式是什么 我实现了add_old_way成员函数,该函数能够向ObjectPool添加任何类型的数据,并且工作正常。 我唯一的问题是,我创建了一个额外的对象,我把它传递给那个函数,在里面,我只是在赋值后把它扔掉。浪费资源,如果我们谈论的是巨大的类 我应该如何实现add_new_way函数,该函数能够获取任意参数并将它们分别分

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

}
模板
类对象池
{
矢量运动对象;
ObjectPool():移动对象(大小)
{
}
//这就是我能想到的向对象池添加对象的方法
无效添加旧方式(常量和对象)
{
...
mObjects[nextFreeIndex]=对象;
...
}
//添加对象的理想方式
无效添加新方式(…)
{
mObjects[nextFreeIndex].param1=param1;
mObjects[nextFreeIndex].param2=param2;
...
mObjects[nextFreeIndex].paramN=paramN;
}
};
分类栏
{
条形图(整数x,字符串s)
{
mX=x;
mS=s;
}
int-mX;
字符串mS;
};
int main()
{
对象池五;
对象池五;
//这就是我能想到的
v、 增加旧路(cBar(1,“asdf”);
v、 添加旧方法(cMatrix2x2(1,2,3,4));
//添加对象的理想方式
v、 增加新方式(1,“asdf”);
v、 增加新的方式(1,2,3,4);
}

如果使用C++11及以上版本,要实现您的
添加新方式
方法,您可以使用可变模板参数和转发:

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

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

template <typename... Args>
void add_new_way(Args&&... args)
{
    mObjects[nextFreeIndex] = T{std::forward<Args>(args)...};
}
模板
无效添加新方式(Args&…Args)
{
mObjects[nextFreeIndex]=T{std::forward

由于要从中分配的对象是临时对象,因此将调用要分配到的对象的“移动分配”操作符(如果存在)。这将允许对象将任何昂贵的复制资源的所有权从临时对象转移到池中的对象


为了进一步阅读,看看这个问题:

你想让它像
std::vector
中的
emplace\u back
一样吗?@Justin我刚才查了一下,没有意识到。是的,类似这样的东西,甚至看了源代码,但不知道这些任意数量的参数是如何处理的,以及如何分配给indiVIDALY.OT:如果向量大小固定,那么
std::array
呢?可变模板和转发…永远不会明白它们是这样调用的,谢谢!我查找了&&运算符,我想我也应该利用它,所以解决方案标记转到@Miles Budnek
template <typename... Args>
void add_new_way(Args&&... args)
{
    mObjects[nextFreeIndex] = T{std::forward<Args>(args)...};
}