J'ai un objet C++ de type ObjectArray
typedef map<int64_t, std::unique_ptr<Class1>> ObjectArray;
Quelle est la syntaxe pour créer un unique_ptr
dans un nouvel objet de type Class1
et l'insérer dans un objet de type ObjectArray
?
Comme première remarque, je ne l'appellerais pas ObjectArray
s'il s'agit d'une carte et non d'un tableau.
Quoi qu'il en soit, vous pouvez insérer des objets de cette façon:
ObjectArray myMap;
myMap.insert(std::make_pair(0, std::unique_ptr<Class1>(new Class1())));
Ou de cette façon:
ObjectArray myMap;
myMap[0] = std::unique_ptr<Class1>(new Class1());
La différence entre les deux formes est que le premier échouera si la clé 0
est déjà présente dans la carte, tandis que la seconde remplacera sa valeur par la nouvelle.
En C++ 14, vous voudrez peut-être utiliser std::make_unique()
au lieu de construire le unique_ptr
à partir d'une expression new
. Par exemple:
myMap[0] = std::make_unique<Class1>();
Si vous voulez ajouter un pointeur existant à insérer dans la carte, vous devrez utiliser std :: move.
Par exemple:
std::unique_ptr<Class1> classPtr(new Class1);
myMap.insert(std::make_pair(0,std::move(classPtr)));
En plus des réponses précédentes, je voulais souligner qu’il existe également une méthode emplace
(pratique lorsque vous ne pouvez pas/ne voulez pas faire de copie).
ObjectArray object_array;
auto pointer = std::make_unique<Class1>(...); // since C++14
object_array.emplace(239LL, std::move(pointer));
// You can also inline unique pointer:
object_array.emplace(30LL, std::make_unique<Class1>(...));