Произвольный номер назначения параметра с шаблоном класса

Я хотел бы реализовать простой шаблон класса 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);

}

1

Решение

Используйте семантику перемещения и совершенную пересылку, чтобы сделать назначение дешевым:

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

Жить на Колиру

Так как объект, от которого назначается объект, является временным, оператор назначения перемещения объекта, которому назначен объект, будет вызываться, если он существует. Это позволит объекту передать право собственности на любые дорогостоящие для копирования ресурсы из временного объекта в пул.

Для дальнейшего чтения взгляните на этот вопрос: Что такое семантика перемещения?

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

По вопросам рекламы [email protected]