[C++] unifier les itérateurs ...
Bonjour,
J'essaye d'unifier différents types d'itérateurs afin de simplifier l'interface de plusieurs classes containers. Concrètement, voici (en essence) ce que j'ai tenté :
Dans le but de remplacer les vector<A>::iterator et set<A>::iterator par des A_iterator (unification pour l'utilisateur, et encapsulation qui fait que l'utilisateur n'a pas besoin de savoir qu'un B est implémenté par un vector+set pour s'y promener ...)
Malheureusement, le compilo refuse de caster le type d'itérateur retourné par v.begin() en un A_iterateur, même explicitement.
Une idée, un conseil, une astuce ?
Merci d'avance !
J'essaye d'unifier différents types d'itérateurs afin de simplifier l'interface de plusieurs classes containers. Concrètement, voici (en essence) ce que j'ai tenté :
class A {...}; typedef std::iterator<std::bidirectional_iterator_tag, A> A_iterator; class B { private: std::vector<A> v; std::set<A> s; public: A_iterator v_begin() {return v.begin();} ... A_iterator s_end() {return s.end();} };
Dans le but de remplacer les vector<A>::iterator et set<A>::iterator par des A_iterator (unification pour l'utilisateur, et encapsulation qui fait que l'utilisateur n'a pas besoin de savoir qu'un B est implémenté par un vector+set pour s'y promener ...)
Malheureusement, le compilo refuse de caster le type d'itérateur retourné par v.begin() en un A_iterateur, même explicitement.
Une idée, un conseil, une astuce ?
Merci d'avance !
1 réponse
Ben ca ne me surprend pas que le compilo te jète :p Moi je ferais plutôt une fonction template sur le container :
Cette fonction étant template elle doit impérativement être déclarées et implémentée dans le .hpp
Bonne chance
template <typename Tcontainer> void show_container(const Tcontainer & c){ typename Tcontainer::const_iterator cit (c.begin()), cend(c.end()); for(;cit!=cend;++cit){ std::cout << *cit << ' '; } std::cout << std::endl; }
Cette fonction étant template elle doit impérativement être déclarées et implémentée dans le .hpp
Bonne chance