2013-12-20 79 views
0

我想實現一個封裝另一個迭代器並執行範圍檢查的迭代器。因此,我從這樣的迭代器如此延伸:在C++中擴展迭代器

template<typename ITERATOR_T> 
class r_iterator : public ITERATOR_T { 

    //... 

    r_iterator (ITERATOR_T begin, ITERATOR_T end) { 
     this->begin = begin; 
     this->end = end; 
    } 
}; 

我想使用在構造函數中傳遞的迭代器來執行範圍檢查。我的想法是將「this」引發器(即r_iterator)指向的元素指向由構造函數的「begin」迭代器指向的元素。我想這樣做,我可以重寫某些方法,如運算符++,例如,執行範圍檢查,然後調用我正在擴展的類的超級方法。

我想知道是否有可能以某種方式設置「this」-iterator(r_iterator)指向的元素,假定我擴展了一些STL Iterator類。

我很遺憾沒有在C++的參考資料中找到任何關於它的信息。

問候,並感謝您

+1

聽起來類似於'提振:: iterator_range'。 – Rapptz

+0

不幸的是,我需要它自制。 – ben

+0

爲什麼不委派代替繼承? –

回答

0

有沒有需要繼承,你可以寫一個簡單的包裝類,像這樣:

#include <iostream> 
#include <vector> 
#include <stdexcept> 

template <typename Iterator> 
class MyIterator 
{ 
    Iterator _begin; 
    Iterator _end; 
    Iterator _cur; 
public: 
    explicit MyIterator(Iterator begin, Iterator end) 
     : _begin(begin), _end(end) 
    { 
     _cur = _begin; 
    } 

    bool has_next() const 
    { 
     return (_cur != _end); 
    } 

    void operator++(int dummy) 
    { 
     if (!has_next()) 
      throw std::out_of_range("Out of range."); 
     _cur++; 
    } 
}; 

int main(int argc, char* argv[]) 
{ 
    std::vector<int> v = {1, 2, 3}; 
    MyIterator<std::vector<int>::iterator> my_it(v.begin(), v.end()); 
    my_it++; 
    my_it++; 
    my_it++; 
    my_it++; 
    return 0; 
} 
+0

如果你只是實現一個前向迭代器,你不需要'begin'。一個重載封裝將從MyIteratorImpl :: iterator_category>繼承,它專用於所有類別。 – MSalters