2017-08-20 4 views
1

J'ai une classe avec un std privé :: carte de unique_ptr:utilisant l'opérateur [] pour accéder à un std privé :: carte de unique_ptr

class MyClass{ 
std::map <KeyType, std::unique_ptr<my_type>> my_map; 
... 
}; 

J'ai choisi parce que unique_ptr my_map est le seul propriétaire des objets my_type .

Je voudrais exposer une fonction de membre public opérateur [] pour accéder (renvoi parfait) my_map. Quelque chose comme:

// my_class is of type MyClass 
auto ptr = my_type_factory(...); // my_type_factory returns a std::unique_ptr<my_type> 
.... 
my_class[1] = std::move(auto_ptr); 

J'ai essayé avec diverses définitions possibles de l'opérateur []:

class MyClass{ 
.... 
public: 
auto operator[](KeyType && key) { return my_map[std::forward<KeyType>(key)]; } 
// or return & my_map[...]; 
}; 

mais il ne fonctionne pas, à la fin j'invoque toujours le constructeur de copie supprimé de unique_ptr . Pour avancer, si je déplace my_map vers l'interface publique, j'ai réussi tous mes tests, mais c'est tricher bien sûr, puisque j'essaie d'affiner mes compétences C++ modernes et je pense qu'il y a un principe qui Je n'ai pas encore grokked avec unique_ptr et bouge. Donc, ma question est: comment utiliser std :: unique_ptr's dans une std :: map privée?

+0

@LogicStuff: Ne peut pas être dupe de celui-là, juste par le titre. – einpoklum

Répondre

4

Vous devez renvoyer une référence.

auto & operator[](KeyType && key) { return my_map[std::forward<KeyType>(key)]; } 
+0

Mais cela ne toucherait-il pas aussi le ctor par défaut supprimé d'un unique_ptr? – einpoklum

+1

@einpoklum Le constructeur par défaut de 'unique_ptr' n'est pas supprimé, seuls le constructeur de copie et l'opérateur d'affectation de copie sont. Il sera initialisé avec nullptr. – VTT

+0

Ça marche, super. Pourriez-vous élaborer pour que je puisse mieux comprendre? Dans mon idée l'opérateur [] appelé sur my_map renvoyait déjà une référence et je m'attendais à ce que le "auto" soit déjà une référence. Qu'est-ce que je rate? – Francesco