2013-06-04 10 views
34

Ho un C++ oggetto di tipo ObjectArrayC++ inserendo unique_ptr nella mappa

typedef map<int64_t, std::unique_ptr<Class1>> ObjectArray; 

Qual è la sintassi per creare un unique_ptr a un nuovo oggetto di tipo Class1 e inserirla in un oggetto di tipo ObjectArray?

+0

la seguente pagina MSDN ha qualche informazione su questo articolo: http://msdn.microsoft.com/en-us/library/vstudio/hh279676.aspx – yuyang

risposta

47

Come prima osservazione, non lo chiamerei ObjectArray se si tratta di una mappa e non di un array.

In ogni caso, è possibile inserire gli oggetti in questo modo:

ObjectArray myMap; 
myMap.insert(std::make_pair(0, std::unique_ptr<Class1>(new Class1()))); 

O in questo modo:

ObjectArray myMap; 
myMap[0] = std::unique_ptr<Class1>(new Class1()); 

La differenza tra le due forme è che il primo non riuscirà se la chiave 0 è già presente nella mappa, mentre il secondo sovrascriverà il suo valore con quello nuovo.

In C++ 14, è possibile utilizzare std::make_unique() invece di costruire unique_ptr da un'espressione new. Per esempio:

myMap[0] = std::make_unique<Class1>(); 
+1

+1 per completezza e chiarezza. – taocp

+0

@milleniumbug: buon suggerimento, permettimi di aggiungerlo alla risposta. Grazie –

+1

Un'altra opzione è il membro emplace: myMap.emplace (0, new Class1). Tuttavia, non tutte le librerie supportano questo membro. –

34

Se si desidera aggiungere un puntatore esistente da inserire nella mappa, si dovrà utilizzare std :: mossa.

Ad esempio:

std::unique_ptr<Class1> classPtr(new Class1); 

myMap.insert(std::make_pair(0,std::move(classPtr)));