Так что в интересах создания Минимально. Полный, проверяемый пример Я создал игрушку iterator
здесь (я знаю, что это не идеально, это просто для того, чтобы задать вопрос):
class foo : public iterator<input_iterator_tag, string> {
string _foo;
static const size_t _size = 13;
public:
const string& operator*() { return _foo; }
const foo& operator++() {
_foo += '*';
return *this;
}
const foo operator++(int) {
auto result = *this;
_foo += '*';
return result;
}
bool operator==(const foo& rhs) { return _foo.empty() != rhs._foo.empty() && _foo.size() % _size == rhs._foo.size() % _size; }
bool operator!=(const foo& rhs) { return !operator==(rhs); }
};
Я прочитал, что InputIterator должен быть определен оператор выбора члена. Оператор косвенного обращения имеет смысл, но здесь меня смущает оператор выбора члена. Как будет реализован оператор выбора участника для foo
?
const string* operator->() const { return &_foo; }
Пример использования:
foo i;
++i;
assert(i->length() == 1);
Это работает так, что компилятор будет генерировать повторные вызовы operator->
пока возвращаемый тип не является необработанным указателем (так что в этом случае только один вызов foo::operator->
), затем выполните обычную операцию выбора элемента для этого указателя.
operator->()
должен возвращать тип указателя типа, который содержит контейнер, в котором используется итератор. Так что если у вас есть контейнер, который содержит std::string
тогда iterator::operator->
должен вернуть std::sting*
, В вашем случае, так как вы производите от std::iterator
Вы можете использовать pointer
typedef для возвращаемого типа.