2008-08-13 28 views
29

Próbuję znaleźć ogólny sposób dostępu do zestawu kontenerów. Mam standardowy wektor i listę oprócz innej niestandardowej listy.Ogólny iterator

Lista niestandardowa definiuje iterator;

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

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

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

z odpowiednimi operatorami przeciążonymi.

Idealnie, chciałbym to zrobić;

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

Ale oczywiście są to wszystkie iteratory różnych typów. Mogę jednak założyć, że wszystkie pojemniki są tego samego typu.

Czy istnieje elegancki sposób rozwiązania tego problemu?

Odpowiedz

2

lepiej późno niż wcale ...

W najnowszym numerze C-Vu odkopany i zgadnij, co było w środku: Zgadza się, iteratory dokładnie to, co chciałeś .

Niestety musisz zostać członkiem ACCU, aby obejrzeć czasopismo (artykuł odwołuje się do artykułu Overload z 2000 roku, do którego David się odwołuje). Ale za nędzną cenę w roku dostaniesz ładny magazyn do czytania, konferencje i grupy użytkowników. Kiedy stajesz się członkiem, możesz zobaczyć PDF z powrotem problemów, więc what are you waiting for?

+2

Byłoby pomocne, gdybyś wspomniał, że artykuł można znaleźć w tomie 20 wydania 3 czerwca 08 zatytułowanym Custom Iterators in C++. ładne zdjęcie użytkownika btw. – danio

1

Przypadek bycia ostrożnym o co prosisz. Klasa any_iterator, którą widzisz, działa na nieograniczonym zestawie typów iteratorów. Masz tylko trzy, które znasz z góry. Oczywiście, być może będziesz musiał dodać czwarty typ w przyszłości, ale co z tego, jeśli zajmie to O (1) dodatkowe linie kodu?

Dużą zaletą zamkniętego zestawu możliwych typów zawartych jest to, że posiadasz górną granicę sizeof(), co oznacza, że ​​możesz uniknąć kupki i jej nieokreśloności. Zasadniczo, napakuj je wszystkie w boost :: variant i wywołaj apply_visitor.