Amonchakai | Bonjour,
Je me suis posé un petit exercice : j'ai d'abord cherché à créer un modèle de conteneur associatif.
Ce qui me donne :
Code :
- #include<vector>
- #include<algorithm>
- template<typename T, typename T2>
- struct Pair
- {
- T key;
- T2 value;
- Pair(T gkey):key(gkey){};
- Pair(T gkey, T2 gvalue):key(gkey), value(gvalue) {};
- bool operator==(const Pair<T, T2> &other);
- };
- template<typename T, typename T2>
- bool Pair<T, T2>::operator ==(const Pair<T,T2> &other)
- {
- return (other.key == key);
- }
- template<typename T, typename T2>
- class Map
- {
- std::vector<Pair<T, T2>> data;
- public:
- typedef typename std::vector<Pair<T,T2>>::iterator iterator;
- iterator begin();
- iterator end();
- virtual T2 &operator[](T key);
- };
- template<typename T, typename T2>
- T2 &Map<T, T2>::operator [](T key)
- {
- std::vector<Pair<T, T2>>::iterator it = data.begin();
- it = std::find(data.begin(), data.end(), Pair<T,T2>(key, T2()));
- if(it == data.end())
- {
- data.push_back(Pair<T,T2>(key, T2()));
- return (data.back()).value;
- }
- else
- return (*it).value;
- }
- template<typename T, typename T2>
- typename Map<T,T2>::iterator Map<T, T2>::begin()
- {
- return data.begin();
- }
- template<typename T, typename T2>
- typename Map<T,T2>::iterator Map<T, T2>::end()
- {
- return data.end();
- }
|
Donc ça, j'ai pas de soucis : ça marche. Mais a titre d'exercice je me suis dit que j'allais chercher a traiter autrement les pointeurs. Donc pour cela j'ai dérivé mon modèle comme ça :
Code :
- template<typename T, typename T2>
- class Map<T, T2*> : public Map<T, T2>
- {
- public:
- T2 *operator[](T key);
- };
- template<typename T, typename T2>
- T2 *Map<T, T2*>::operator [](T key)
- {
- std::vector<Pair<T, T2>>::iterator it = data.begin();
- it = std::find(data.begin(), data.end(), Pair<T,T2>(key));
- if(it == data.end())
- {
- data.push_back(Pair<T,T2*>(key, &T2()));
- return (data.back()).value;
- }
- else
- return (*it).value;
- }
|
Mais la, mon problème c'est qu'il est pas content que le type de retour de mon opérateur [] change entre la classe mère et la classe fille. Ce que je comprend... mais en fait je vois pas comment régler le problème. (autre que de changer d'exemple pour m'entrainer à ce type de spécialisation... )
Donc, je sais pas si vous voyez une solution...
Merci
ps : au passage si il y a quelque chose qui vous choque dans mon utilisation des modèles, merci de me le signaler (je demande qu'a m'améliorer ) |