Frage

Ich versuche, eine generische Möglichkeit zu finden, auf eine Reihe von Containern zuzugreifen.Ich habe einen Standardvektor und eine Standardliste zusätzlich zu einer anderen benutzerdefinierten Liste.

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

wobei die entsprechenden Operatoren überlastet sind.

Im Idealfall würde ich das gerne 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 offensichtlich sind das alles Iteratoren unterschiedlichen Typs.Ich kann jedoch davon ausgehen, dass alle Behälter vom gleichen Typ sind.

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

War es hilfreich?

Lösung

Hier finden Sie einige Artikel, die für Sie von Interesse sein könnten

STL-Iteratoren eine Basisklasse geben

Geben Sie Erasure für C++-Iteratoren ein

any_iterator-Klassenreferenz

Andere Tipps

Besser spät als nie...

Die neueste Ausgabe von C-Vu aufgetaucht und rate mal, was drin war:Das ist richtig, Iteratoren, die das tun genau was du wolltest.

Leider müssen Sie Mitglied werden AKKU um das Magazin anzusehen (der Artikel verweist auf den Overload-Artikel aus dem Jahr 2000, auf den David verlinkt).Aber für einen mageren Preis im Jahr bekommt man eine schöne Zeitschrift zum Lesen, Konferenzen und Benutzergruppen.Wenn Sie Mitglied werden, können Sie sich PDFs der früheren Ausgaben ansehen Worauf wartest du?

Man muss vorsichtig sein, was man verlangt.Die any_iterator-Klassen, die Sie sehen, arbeiten mit einer unbegrenzten Menge von Iteratortypen.Sie haben nur drei, die Sie im Voraus kennen.Natürlich müssen Sie möglicherweise in Zukunft einen vierten Typ hinzufügen, aber was ist, wenn dafür O(1) zusätzliche Codezeilen erforderlich sind?

Der große Vorteil einer geschlossenen Menge möglicher enthaltener Typen besteht darin, dass Sie eine Obergrenze für sizeof() haben, was bedeutet, dass Sie den Heap und die damit verbundene Indirektion vermeiden können.Packen Sie sie im Grunde alle in einen boost::variant und rufen Sie apply_visitor auf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top