[C++] unifier les itérateurs ...

zzegod Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   -
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é :

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

mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
Ben ca ne me surprend pas que le compilo te jète :p Moi je ferais plutôt une fonction template sur le container :
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
0