Я пытаюсь реализовать итератор, который инкапсулирует другой итератор и выполняет проверку диапазона. Поэтому я расширяю этот итератор так:
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» итератор из конструктора. Это я хотел бы сделать, чтобы я мог переопределить некоторые методы, такие как operator ++, например, выполнить проверку диапазона и затем вызвать супер метод класса, который я расширяю.
Таким образом, я хотел бы знать, возможно ли каким-либо образом установить элемент, который указывает «this» -итератор (r_iterator), предполагая, что я расширяю некоторый класс итераторов STL.
К сожалению, я не смог найти никакой информации об этом в справочнике по c ++.
С уважением и спасибо
Нет необходимости наследовать, вы можете написать простой класс-оболочку, например:
#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;
}
Других решений пока нет …