2014-10-14 15 views
8

Si consideri la seguente riga di codice:È possibile usare std :: make_unique con l'interfaccia astratta?

auto source1 = std::unique_ptr<IGpsSource>(new GpsDevice(comPort, baudrate)); 
auto source2 = std::unique_ptr<IGpsSource>(new GpsLog(filename)); 

Come può essere scritta utilizzando la nuova funzione std :: make_unique, supportata da VS 2013? È possibile? *

* Il mio problema è che non so come dire a 'make_unique' che tipo di oggetto istanziare. Perché solo i parametri del costruttore sono passati sembra che non ci sia alcun controllo su questo ...

+0

Non è C++ 14? Pensavo che VS2013 non lo supportasse –

+1

@MarcoA. VS2013 supporta alcuni C++ 14 bit e 'make_unique' è uno di questi. – Angew

+0

@Angew Non lo sapevo. Grazie! –

risposta

12

Sì, puoi ovviamente usare make_unique per quello, ma non è così utile come potresti volere. Sono disponibili le seguenti opzioni: "Perché vuoi che"

std::unique_ptr<IGpsSource> source1 = std::make_unique<GpsDevice>(comPort, baudrate); 
auto source2 = std::unique_ptr<IGpsSource>{ std::make_unique<GpsLog>(filename) }; 

Direi che la vera domanda è

  1. differenza make_shared, make_unique non ha benefici di allocazione oltre new. Quindi se hai bisogno di controllare il tipo del puntatore, quello che stai facendo va bene.

  2. Perché è necessario digitare il puntatore su IGpsSource in primo luogo? Una conversione implicita da std::unique_ptr<Derived>rvalori a std::unique_ptr<Base> esistono rvalori. Quindi, se in realtà stai chiamando make_unique per inizializzare un puntatore IGpsSource, funzionerà perfettamente. E se vuoi trasferire il puntatore da qualche parte, dovrai comunque farlo std::move, a quel punto la conversione può ripetersi.

+2

L'argomento di sicurezza di eccezione [da questa risposta] (http://stackoverflow.com/a/20895705/673852) si applica ancora a 'make_unique', non solo a' make_shared'. Quindi, 'make_unique ()' dovrebbe essere preferito a 'unique_ptr (new Xyz)'. – Ruslan

+0

@Ruslan Si noti che il criterio di sicurezza delle eccezioni si applica a più allocazioni eseguite in una singola espressione. Il caso dell'OP è molto diverso: hanno solo una singola allocazione e vogliono un controllo preciso sul tipo del puntatore. – Angew

Problemi correlati