2013-12-20 3 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"-iterator (즉, r_iterator)가 가리키는 요소를 생성자의 "begin"반복자가 가리키는 요소로 설정하는 것입니다. 예를 들어, 연산자 ++와 같은 특정 메서드를 재정의 할 수 있도록 범위 검사를 수행 한 다음 확장중인 클래스의 super 메서드를 호출합니다.

따라서 "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

forward iterator 만 구현하는 경우에는'begin'이 필요 없습니다. 강력 함 랩퍼는 모든 범주에 대해 특수화 된 MyIteratorImpl :: iterator_category>를 상속합니다. – MSalters