2016-12-28 13 views
5

を使用してunique_ptrの配列を埋め込むことはできますか?意図は、同じパラメータで初期化された別個のオブジェクトへの別個のポインタを有することである。例えば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'を繰り返すつもりはありません。 – 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:Yes :) –

+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); 
} 
関連する問題