2016-12-28 2 views
5

Ist es möglich, std:fill zu verwenden, um ein Array von unique_ptr s zu füllen? Die Absicht ist, verschiedene Zeiger auf unterschiedliche Objekte zu haben, die mit den gleichen Parametern initialisiert werden.Wie füllt man ein Array von unique_ptr?

Zum Beispiel:

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

Ist 'std :: array' zusammen mit einem 'std :: initializer_list' eine Option? –

+0

'std :: array' ist eine Option, aber die Absicht ist nicht, das gleiche Füllelement' N' zu wiederholen. – Danra

+0

Deshalb habe ich 'std :: initializer_list' (oder einfach' {} 'Initialisierung) vorgeschlagen. –

Antwort

19

Nein, aber das ist, was std::generate für ist.

Anstatt einen einzelnen Wert zu erhalten, der innerhalb des Zielbereichs kopiert wird, erhält std::generate eine "Generator" -Funktion, die jeden Wert nach Bedarf erstellt.

Also, wahrscheinlich, so etwas wie diese:

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

Ich habe nicht versucht, und nicht wissen, ob Sie mit ihm überhaupt, um fummeln müssen Probleme die sich aus nicht-Kopierbarkeit zu vermeiden . Hoffentlich reicht die Bewegungssemantik.

(Natürlich in C++ 11, werden Sie your own make_unique function benötigen.)

By the way, Ihre .begin() und .end() falsch waren (Arrays haben keine Member-Funktionen), so (dank einer Erinnerung von songyuanyao) Ich habe diese korrigiert.

+0

@songyuanyao: Ja :) –

+0

'std :: make_unique' gab es nicht zurück in C++ 11 :) – Quentin

+0

@Quentin: OP hat die Frage C++ 14 markiert. Sie oder er oder es kann immer auf ein Homebrew 'make_unique' zurückgreifen, wenn nötig :) –

8

Ich glaube nicht, dass Sie es mit std::fill() tun können, aber es ist trivial mit std::generate() zu tun:

std::unique_ptr<int> array[10]; 
std::generate(std::begin(array), std::end(array), 
       []{ return std::unique_ptr<int>(new int(17)); }); 
0

Eine andere Lösung:

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

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