Я пишу класс итератора (скажем MyIterator
) для библиотеки.Создать const iterator и non const iterator
Это хорошая идея использовать сопзЬ перегружать, чтобы сделать const MyIterator
действует подобно const_iterator
из std::vector
в то время как MyIterator
действует как как iterator
из std::vector
?
Будет ли запутан пользователь/разработчик библиотеки?
Реализация будет, как:
// std::iterator example
#include <iostream> // std::cout
#include <iterator> // std::iterator, std::input_iterator_tag
class MyIterator : public std::iterator<std::input_iterator_tag, int>
{
mutable int* p;
public:
MyIterator(int* x) :p(x) {}
MyIterator(const MyIterator& mit) : p(mit.p) {}
MyIterator& operator++() {++p;return *this;}
MyIterator operator++(int) {MyIterator tmp(*this); operator++(); return tmp;}
bool operator==(const MyIterator& rhs) {return p==rhs.p;}
bool operator!=(const MyIterator& rhs) {return p!=rhs.p;}
const int& operator*() const {return *p;} // <-- const overload
int& operator*() {return *p;}
};
Альтернатива будет использовать шаблоны для реализации одного класса итератора, который может быть специализирован в сопзЬ и неконстантные итераторы. В настоящее время я это делаю (я слышал, что boost делает это ...). Но шаблоны становятся сложными очень быстро, поскольку я реализую диапазон, а затем диапазон диапазона (как в вложенном диапазоне, основанный на цикле).
Ад есть «мит»? Могу ответить на ваш вопрос. – George
@George Я воспринимаю это как итератор, называемый 'mit'. Возможно, сокращенно для 'my_iterator'. – NathanOliver
Я бы смутился, но это только я. – jrok