2013-05-21 5 views
15

Ich habe versucht, einen einfachen Weg zu finden, um Elemente in einem std::vector<std::shared_ptr<int>> zu platzieren, konnte aber mit nichts kommen. std::shared_ptr nimmt Zeiger als Parameter, so kann ich dies noch schreiben:make_shared and emplace Funktionen

std::vector<std::shared_ptr<int>> vec; 
vec.emplace_back(new int(10)); 

aber ich will nicht new von Hand verwenden, wenn möglich, und mochte lieber std::make_shared wenn möglich verwenden. Das Problem ist, dass, wenn ich es wirklich verwenden wollen, ich habe push_back stattdessen verwenden und den Vorteil der in-place Bau verlieren:

std::vector<std::shared_ptr<int>> vec; 
vec.push_back(std::make_shared<int>(10)); 

Gibt es eine Möglichkeit, sowohl die Vorteile von emplace_back und std::make_shared zu bekommen? Wenn nicht, gibt es eine Richtlinie, die ich in einem solchen Fall befolgen sollte?

EDIT: Eigentlich habe ich diese Frage gestellt, hatte aber ein nicht verwandtes Problem. Andys Antwort ist die gute und es gibt kein tatsächliches Problem mit der Verwendung von emplace Funktionen und std::make_shared auf einmal.

Antwort

14

Sie können an Ort und Stelle bewegen Konstruktion lassen auftreten:

vec.emplace_back(std::make_shared<int>(42)); 
+0

Ich denke, dass so gut wie es –

+0

bekommen geht Hat er nicht sagen, nur, dass er das nicht tun könnte? – 0x499602D2

+0

@ 0x499602D2: Warum nicht? –