2016-12-28 148 views
5

是否可以使用std:fill來填充unique_ptr s的數組?其目的是對使用相同參數初始化的不同對象有不同的指針。如何填充unique_ptr的數組?

例如:

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

是'的std ::有array'一起'std :: initializer_list'選項? –

+0

'std :: array'是一個選項,但意圖是不重複相同的填充元素'N' times – Danra

+0

這就是爲什麼我提出'std :: initializer_list'(或者簡單的'{}'初始化)。 –

回答

19

沒有,但是這是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,你將需要your own make_unique function

順便說一句,你.begin().end()是錯誤的(數組沒有成員函數),所以(感謝提醒來自songyuanyao)我糾正了這些。

+0

@songyuanyao:是:) –

+0

'std :: make_unique'不存在在C++ 11中:) – Quentin

+0

@Quentin:OP已經標記了問題C++ 14。她或他或它可以總是回到自制的'make_unique'如果需要的話:) –

8

我不認爲你可以做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)); }); 
0

另一種解決方案:

std::unique_ptr<int> ar[3]; 

size_t i; 
for (i = 0; i < elementsof(ar); ++i) { 
    ar[i].reset(new int); 
}