Как заполнить массив уникальных ptr?

можно использовать std:fill для заполнения массива unique_ptrs? Намерение состоит в том, чтобы иметь четкие указатели на различные объекты, которые инициализируются с теми же параметрами.

например:

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