如何填充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);
}
是否可以使用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);
}