2008-08-13 19 views
29

Ich versuche eine generische Art des Zugriffs auf eine Reihe von Containern zu finden. Ich habe einen Standardvektor und eine Liste zusätzlich zu einer anderen benutzerdefinierten Liste.Generic iterator

Die benutzerdefinierte Liste definiert einen Iterator;

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

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

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

mit den entsprechenden Operatoren überlastet.

Idealerweise möchte ich dies tun;

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; 
}; 

Aber natürlich sind diese alle Iteratoren verschiedenen Typen. Ich kann jedoch davon ausgehen, dass alle Container vom selben Typ sind.

Gibt es eine elegante Möglichkeit, dieses Problem zu lösen?

Antwort

2

Besser spät als nie ...

Die neueste Ausgabe des C-Vu aufgedreht und rate, was drin war: Das stimmt, Iteratoren das tun genau was Sie wollten.

Leider müssen Sie Mitglied der ACCU werden, um das Magazin anzuzeigen (der Artikel verweist auf den Artikel "Overload" von 2000, auf den David verweist). Aber für einen miesen Preis pro Jahr bekommt man ein schönes Magazin zum Lesen, Konferenzen und Usergruppen. Wenn Sie ein Mitglied werden, können Sie PDFs der hinteren Ausgaben so what are you waiting for ansehen?

+2

Wäre hilfreich gewesen, wenn Sie erwähnt hätten, dass der Artikel in Bd. 20, Ausgabe 3, Juni 08 mit dem Titel Custom Iterators in C++ zu finden ist. schönes Userbild übrigens. – danio

1

Ein Fall von vorsichtig sein, wonach Sie fragen. Die Any_iterator-Klassen, die Sie sehen, arbeiten an einem unbegrenzten Satz von Iteratortypen. Sie haben nur drei, die Sie im Voraus kennen. Sicher, Sie müssen vielleicht in Zukunft einen vierten Typ hinzufügen, aber was ist, wenn das O (1) zusätzliche Codezeilen erfordert?

Der große Vorteil einer geschlossenen Gruppe von möglichen enthaltenen Typen ist, dass man eine obere Schranke auf sizeof haben(), was bedeutet, dass Sie den Heap vermeiden und den Indirektionsoperator bringt. Im Grunde füllen Sie alle in einer boost :: variant und rufen apply_visitor auf.