使用模板类的任意数量的参数分配
Arbitrary number of parameter assignment with template class
我想实现一种简单的模板对象池类。它具有固定的大小向量作为成员变量,在创建时默认将元素的变量默认。这已经完成并且工作正常。
问题是将新元素分配给成员向量的最佳方法是什么?
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);
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 在C++中传递给函数时,为什么要指定数组大小作为参数
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 具有任意数量参数的模板函数
- 使用 std::function 作为具有任意数量参数的数据成员
- 使用模板将任意类型参数传递给 C++ 中的函数
- C++具有模板成员的类,该类使用任意模板参数构造模板成员
- is_invocable使用任意函数参数类型
- 如何为函数参数指定任意模板参数?
- 如何在C++中找到任意数组的大小
- 在具有任意数量子级的节点树中查找节点
- 变量数参数列表从其第二个条目开始
- 读取任意大小的任意数组
- 函数指向具有任意数量参数的任何成员函数
- 如何创建一个工厂函数模板来构造给定任意数量参数的对象
- 如何传递任意数组的结构到一个函数
- 可以在c++中使用任意模板参数