Расширение итераторов в 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-итератор (r_iterator), предполагая, что я расширяю некоторый класс итераторов STL.

К сожалению, я не смог найти никакой информации об этом в справочнике по C++.

С уважением и спасибо

1 ответ

Решение

Нет необходимости наследовать, вы можете написать простой класс-оболочку, например:

#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;
}
Другие вопросы по тегам