Как заполнить массив уникальных ptr?
можно использовать std:fill
для заполнения массива unique_ptr
s? Намерение состоит в том, чтобы иметь четкие указатели на различные объекты, которые инициализируются с теми же параметрами.
например:
std::unique_ptr<int> ar[3];
std::fill(ar.begin(), ar.end(), make_unique_for_each_element_somehow<int>(1));
3 ответов
нет, но это std::generate
для.
вместо того, чтобы давать одно значение, которое копируется по всему целевому диапазону,std::generate
задается функция "генератор", которая создает каждое значение по мере необходимости.
так, наверное, что-то вроде этого:
std::unique_ptr<int> ar[3];
std::generate(
std::begin(ar),
std::end(ar),
[]() { return std::make_unique<int>(1); }
);
Я не пробовал и не знаю, нужно ли вам вообще возиться с ним, чтобы избежать проблем, возникающих из-за невозможности копирования. Надеюсь, семантика перемещения достаточно.
(конечно, в C++11, Вам понадобится свой make_unique
функции.)
кстати,.begin()
и .end()
были неправильными (массивы не имеют функций-членов), поэтому (благодаря напоминанию от songyuanyao) я исправил их.
Я не думаю, что вы можете сделать это с помощью std::fill()
но это тривиально делать с std::generate()
:
std::unique_ptr<int> array[10];
std::generate(std::begin(array), std::end(array),
[]{ return std::unique_ptr<int>(new int(17)); });
другое решение:
std::unique_ptr<int> ar[3];
size_t i;
for (i = 0; i < elementsof(ar); ++i) {
ar[i].reset(new int);
}