2013-05-21 19 views
15

Stavo cercando di trovare un modo semplice per inserire elementi in un std::vector<std::shared_ptr<int>> ma non è possibile venire con nulla. std::shared_ptr prende puntatori come parametri, così posso ancora scrivere questo:funzioni make_shared e emplace

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

Tuttavia, non voglio usare new a mano se possibile, e sarebbe piuttosto desidera utilizzare std::make_shared se possibile. Il problema è che se voglio davvero usarlo, devo usare push_back invece e perdere il vantaggio di costruzione sul posto:

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

C'è un modo per ottenere i vantaggi di entrambi emplace_back e std::make_shared? In caso contrario, c'è una linea guida che dovrei seguire in questo caso?

MODIFICA: In realtà, ho fatto questa domanda, ma ho avuto un problema non correlato. La risposta di Andy è buona e non c'è alcun problema con l'utilizzo di entrambe le funzioni emplace e std::make_shared contemporaneamente.

risposta

14

Si potrebbe lasciare sul posto la costruzione mossa si verifichi:

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

penso che sia buono come si sta per arrivare –

+0

Non Ha appena detto che non poteva farlo? – 0x499602D2

+0

@ 0x499602D2: perché no? –