4 votes

C++-11 pour une carte d'objets hétérogènes

J'ai un cache d'objets hétérogènes, stockés par nom. Notez qu'il n'existe pas de classe de base commune pour ces objets. Au moment de la création, je dois également stocker un objet Deleter (puisque je connais le type à ce moment-là), de sorte que la carte ressemble à ceci :

map<string, pair<void *, Deleter> > data;

chaque fois qu'un objet est récupéré (par une méthode modélisée), il est réinjecté dans le type demandé. Le destructeur du cache appelle simplement le Deleter et supprime la paire de la carte. Tout cela fonctionne.

Il aurait été agréable, cependant, que C++11 me permette de faire quelque chose comme :

map<string, unique_ptr_base> data;

où unique_ptr_base serait une classe de base (imaginaire) de tous les unique_ptr et son destructeur virtuel supprimerait l'élément. Je pourrais alors simplement supprimer l'élément de la carte sans me préoccuper de la désallocation.

L'écriture d'une classe spéciale à cette fin n'est pas trop difficile, mais dans ce cas, elle n'est pas justifiée, puisque la méthode actuelle n'occupe qu'une ligne de plus et qu'il n'y a pas beaucoup de risque de fuite accidentelle du pointeur. Alors, y a-t-il une caractéristique de la nouvelle norme que j'ai oubliée, ou dois-je la laisser telle quelle ?

4voto

Kerrek SB Points 194696

Si vous n'avez pas d'effaceur d'état, vous pouvez à peu près utiliser :

std::unique_ptr<void, void (*)(void *)>

Par exemple :

using any_ptr = std::unique_ptr<void, void (*)(void *)>;

any_ptr p(static_cast<void *>(std::fopen("/dev/null")),
          [](void * x) { std::fclose(static_cast<FILE*>(x)); });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X