Bonjour à tous.

J'ai un problème relativement aisé, mais dont je n'arrive pas à trouver une solution suffisamment élégante.

Soit un type de map, tel que map<int, string>.
Son itérateur est tel operator*() retourne un value_type, c'est à dire un pair<int, string>. du coup, on passe son temps à écrire iterator->first ou iterator->second.

Le jeu du jour est d'écrire un type d'itérateur qui puisse cacher qu'on a une map. Autrement dit, dont l'operator*() retourne le "->second".

J'ai envisagé la solution directe que voici:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <class Map>
class value_iterator {
private:
    typename Map::iterator it;
 
public:
    explicit value_iterator(typename Map::iterator iterator) : it(iterator) {}
    value_iterator(value_iterator const & other) : it(other.it) {}
    value_iterator& operator=(value_iterator const & other) {it=other.it; return *this;}
 
    value_iterator& operator++() {++it; return *this;}
    value_iterator operator++(int) {return value_iterator(it++);}
 
    value_iterator& operator--() {--it; return *this;}
    value_iterator operator--(int) {return value_iterator(it--);}
 
    typename Map::mapped_type& operator*() {return it->second;}
    typename Map::mapped_type* operator->() {return &(it->second);}
};
//operateurs de comparaisons...
Cela dit, je suis certain de rater des tas de détails.

Comment devrait-je opérer?
Quel lien cette classe devrait-elle avoir avec la classe de trait std::iterator?

Pour la petite histoire, j'ai en réalité plusieurs "banque" d'objets, concues pour fournir des identifiants à utiliser partout, et permettant de ne stoquer qu'un exemplaire.
De là, j'ai des dizaines de listes de tels identifiants (pour éviter les vectors de références)

J'aurai pu partir sur des shared_ptr, mais je n'ai le droit ni a boost, ni a c++11. (bon, j'aurai pu copier la classe manuellement)

Si je me mets le doigt dans l'œil et qu'il y a une bien meilleur architecture, n'hésitez pas à me le signaler.