如何填充unique_ptr的数组?

How to fill an array of unique_ptr?

是否可以使用std:fill来填充unique_ptr的数组?目的是让不同的指针指向使用相同参数初始化的不同对象。

例如:

std::unique_ptr<int> ar[3];
std::fill(ar.begin(), ar.end(), make_unique_for_each_element_somehow<int>(1));

不,但这就是 std::generate 的用途。

不是给定在整个目标范围内复制的单个值,而是给 std::generate 一个 "generator" 函数,它根据需要创建每个值。

所以,大概是这样的:

std::unique_ptr<int> ar[3];
std::generate(
   std::begin(ar),
   std::end(ar),
   []() { return std::make_unique<int>(1); }
);

我没试过,不知道你是否需要 fiddle 来避免不可复制性带来的问题。希望移动语义足够了。

(当然,在 C++11 中,您将需要 your own make_unique function。)

对了,你的.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);
}