Generatorul iterator

Încerc să găsesc o modalitate generică de a accesa un set de containere. Am un vector standard și o listă în plus față de o altă listă personalizată.

Lista personalizată definește un iterator;

class Iterator: public std::iterator {
   //...
}

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

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

cu operatorii corespunzători supraîncărcați.

În mod ideal, aș dori să fac acest lucru;

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

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

       //...
    };
private:
    std::iterator iter;
};

Dar, evident, toate acestea sunt iteratori de diferite tipuri. Pot să presupun că toate containerele sunt de același tip.

Există o modalitate elegantă de a rezolva această problemă?

0
fr hi bn

3 răspunsuri

Mai bine mai tarziu decat niciodata...

Cea mai recentă versiune a C-Vu a apărut și a ghicit ce a fost în ea: Așa este , iteratori care fac exact ceea ce ai vrut.

Din păcate, trebuie să deveniți membru al ACCU pentru a vedea revista (articolul se referă la articolul din articolul Overload din 2000 conform căruia David link-uri către). Dar, pentru un preț rușinos pe an, veți obține o revistă plăcută pentru citire, conferințe și grupuri de utilizatori. Când deveniți membru, puteți vizualiza PDF-urile cu problemele din spate, astfel încât ce așteptați ?

0
adăugat
Ar fi fost util dacă ați menționat că articolul se găsește în volumul 20 din 3 iunie 08 intitulat Iteratori personalizați în C ++. nice user picture btw.
adăugat autor danio, sursa
0
adăugat
Thomas Becker (autorul celui de-al doilea link de mai sus) are un articol mai lung, care este excelent: artima.com/ cppsource/type_erasure.html
adăugat autor Adrian, sursa
@Adrian - acest articol a fost genial: D mulțumesc pentru partajarea!
adăugat autor nevelis, sursa

Un caz de a fi atent la ceea ce cereți. Clasele any_iterator pe care le vedeți lucrează pe un set de iteratori nelimitate. Aveți doar trei, pe care le cunoașteți în față. Sigur, este posibil să aveți nevoie să adăugați un al patrulea tip în viitor, dar ceea ce se întâmplă dacă este nevoie de O (1) linii suplimentare de cod?

Marele avantaj al unui set închis de tipuri posibile conținute este că aveți o limită superioară pentru sizeof (), ceea ce înseamnă că puteți evita halda și indirecția pe care o aduce. Practic, chestii-le pe toate într-o variantă boost :: and call apply_visitor.

0
adăugat