2008-08-13 8 views
29

J'essaie de trouver une façon générique d'accéder à un ensemble de conteneurs. J'ai un vecteur standard et une liste en plus d'une autre liste personnalisée.Itérateur générique

La liste personnalisée définit un itérateur;

class Iterator: public std::iterator<std::forward_iterator_tag, T> { 
    // ... 
} 

Iterator begin() { 
    return (Iterator(root)); 
} 

Iterator end() { 
    return (Iterator(NULL)); 
} 

avec les opérateurs appropriés surchargés.

Idéalement, j'aimerais le faire;

class Foo { 
public: 
    Foo() { 
     std::list<int> x; 
     std::vector<int> y; 
     custom_list<int> z; 

     iter = x.begin(); // OR 
     iter = y.begin(); // OR 
     iter = z.begin(); 

     // ... 
    }; 
private: 
    std::iterator<int> iter; 
}; 

Mais évidemment, il s'agit tous d'itérateurs de types différents. Je peux supposer que tous les conteneurs sont du même type cependant.

Existe-t-il une manière élégante de résoudre ce problème?

Répondre

2

Mieux vaut tard que jamais ...

Le dernier numéro de C-Vu relevai et devinez ce qu'il y avait dedans: c'est vrai, les itérateurs cela fait exactement ce que vous vouliez.

Malheureusement vous devez devenir membre du ACCU pour voir le magazine (l'article fait référence à l'article Overload de 2000 auquel David est lié). Mais pour un prix maigre par an, vous obtenez un bon magazine à lire, des conférences et des groupes d'utilisateurs. Lorsque vous devenez un membre, vous pouvez afficher les PDF des anciens numéros de sorte what are you waiting for?

+2

Aurait été utile si vous aviez mentionné que l'article doit être trouvé dans vol 20 numéro 3 Juin 08 intitulé Iterators personnalisés en C++. belle photo d'utilisateur btw. – danio

1

Un cas de faire attention à ce que vous demandez. Les classes any_iterator que vous voyez fonctionnent sur un ensemble illimité de types d'itérateurs. Vous n'en avez que trois, que vous connaissez à l'avance. Bien sûr, vous devrez peut-être ajouter un quatrième type dans le futur, mais que se passe-t-il si cela prend O (1) des lignes de code supplémentaires?

Le gros avantage d'un ensemble fermé de types contenus possibles est que vous avez une limite supérieure sur sizeof(), ce qui signifie que vous pouvez éviter le tas et l'indirection qu'il apporte. Fondamentalement, placez-les tous dans un boost :: variant et appelez apply_visitor.

Questions connexes