2011-10-21 20 views
7

Próbuję zaimplementować adapter odwrotnego iteratora dla moich klas iteratora i const_iterator z niewielkimi problemami. Gdyby ktokolwiek mógł mnie przez to prowadzić, byłbym bardzo wdzięczny!adapter_wersja_wersji

Chodzi o to, że powinienem być w stanie stworzyć odwrotny-iterację z mojego rbegin() i rend() funkcja zwraca

reverse_iterator rbegin(); 
reverse_iterator rend(); 
const_reverse_iterator rbegin() const; 
const_reverse_iterator rend() const; 

Używam następujące typedef w klasie:

typedef btree_iterator<T> iterator; 
typedef const_btree_iterator<T> const_iterator; 
typedef reverse_btree_iterator<iterator> reverse_iterator; 
typedef reverse_btree_iterator<const_iterator> const_reverse_iterator; 

Jak widać, chciałbym móc tworzyć odwrócone-iteratory za pomocą szablonów, nadając klasie reverse_iterator albo iterator albo const_iterator.

Niestety, jest to nieco utknąłem na ...

Poniżej definicja klasy, że obecnie mam, z błędami.

template <typename I> class reverse_btree_iterator { 

    typedef ptrdiff_t      difference_type; 
    typedef bidirectional_iterator_tag iterator_category; 

public: 

    reverse_btree_iterator() : base_(I()) {} 
    template <typename T> reverse_btree_iterator(const btree_iterator<T>& rhs) : base_(rhs) {} 

    I base() { return base_; } 

    I::reference operator*() const; 
    I::pointer operator->() const; 
    I& operator++(); 
    I operator++(int); 
    I& operator--(); 
    I operator--(int); 
    bool operator==(const I& other) const; 
    bool operator!=(const I& other) const; 

private: 

    I base_; 

}; 

Nigdy nie stosować szablony jak to wcześniej, więc jest bardzo prawdopodobne, jestem całkowicie nieporozumienia w jaki sposób mogą być wykorzystane ...

Ponieważ mogę być iterator lub const_iterator The typedef odniesienia i wskaźnik różnią się w zależności od klasy. Linie, które nie są kompilacją są takie:

I::reference operator*() const; 
I::pointer operator->() const; 

Nie jestem pewien, jak jeszcze mogę uczynić pracę Klasy reverse_iterator zarówno iterator i const_iterator jeśli nie jestem w stanie zrobić I :: odniesienia i I :: wskaźnik. Próbowałem też dodanie szablonu przed tymi, ponieważ są one zdefiniowane w klasie iteratora (na przykład) jako:

typedef T*       pointer; 
typedef T&       reference; 
+1

+1 za odwagę. –

+0

Arent wskaźnik/odwołanie zdefiniowane jako "const T *" i "const T &" w const_iterator, który próbujesz zaadaptować? – gwiazdorrr

+0

"Szablon" jest całkiem blisko. Rekwizyty. – Puppy

Odpowiedz

5

odniesienia i wskaźnik są nazwy zależne, więc trzeba użyć

typename I::reference operator*() const; 
typename I::pointer operator->() const; 

Ponadto konstruktor powinien akceptować tylko I.

Jednak nie ma potrzeby pisania tej klasy w ogóle. Standardowa biblioteka ma w tym celu reverse_iterator. Lub jeśli nie jesteś z tego zadowolony, jest też Boost.ReverseIterator.

Wystarczy tylko

typedef std::reverse_iterator<iterator> reverse_iterator; 
typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 
+1

+1 za wskazanie na stl :: reverse_iterator. Dałbym więcej, gdybym mógł. – Tomek

1

Ponadto użytkownik zapomniał dostarczyć operatorom porównanie z innymi odwróconej iteratorów tego samego typu. Jest to wymóg odwrotnego iteratora.