2009-12-09 5 views
0

ici le dilemme d'aujourd'hui:C++ scanner de conteneurs est basé sur un modèle

suppose que j'ai

class A{ 
    public: 
    virtual void doit() = 0; 
} 

alors différentes sous-classes A, tout mettre en œuvre leur bonne méthode Doït. Supposons maintenant que je veux écrire une fonction qui prend deux itérateurs (l'un au début d'une séquence, l'autre à la fin). La séquence est une séquence de sous-classes A comme dis list<A*> ou vectoriel ... La fonction devrait appeler toutes les méthodes doit en scrutant les itérateurs ... Comment faire? J'ai pensé à:

template<typename Iterator> void doList(Iterator &begin, Iterator &end) { 
    for (; begin != end; begin++) { 
     A *elem = (serializable*) *begin; 
     elem.doIt(); 
    } 
} 

mais donne des erreurs bizarres ... avez-vous de meilleures idées ou des informations spécifiques? Est-il possible d'utiliser list<A> au lieu de list<A*>?

+0

Pouvez-vous s'il vous plaît donner quelques exemples des erreurs étranges que vous obtenez? –

+0

Nit: Êtes-vous sûr de vouloir passer les itérateurs par référence? – dirkgently

Répondre

4

Vous pouvez utiliser le std::foreach pour que:

std::for_each(v.begin(), v.end(), std::mem_fun(&A::doIt)); 

Le std::mem_fun va créer un objet qui appelle la fonction membre donné car c'est l'argument operator(). Le for_each appellera cet objet pour chaque élément au sein de v.begin() et v.end().

+0

+1: mais 'foreach' devrait être orthographié' for_each' –

+0

pourquoi - merci! Je regardais juste un peu trop au code PHP ... – xtofl

1

Vous devez fournir des messages d'erreur pour obtenir de meilleures réponses.

Dans votre code, la première chose qui vient à l'esprit est d'utiliser

elem->doIt(); 

Quel est le type « sérialisable »?

+0

désolé sérialisable signifie A. Comment le compilateur peut savoir que elem a une méthode doIt ??? – gotch4

+2

Parce qu'il sait que elem est de type A * –

4

Pourquoi pensez-vous avoir besoin de la distribution? S'il est une collection de A *, vous devez simplement être en mesure de dire:

(*begin)->doIt(); 
Questions connexes