Выбор элемента перегрузки итератора против оператора косвенного обращения

Так что в интересах создания Минимально. Полный, проверяемый пример Я создал игрушку 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?

0

Решение

const string* operator->() const { return &_foo; }

Пример использования:

foo i;
++i;
assert(i->length() == 1);

Это работает так, что компилятор будет генерировать повторные вызовы operator-> пока возвращаемый тип не является необработанным указателем (так что в этом случае только один вызов foo::operator->), затем выполните обычную операцию выбора элемента для этого указателя.

1

Другие решения

operator->() должен возвращать тип указателя типа, который содержит контейнер, в котором используется итератор. Так что если у вас есть контейнер, который содержит std::string тогда iterator::operator-> должен вернуть std::sting*, В вашем случае, так как вы производите от std::iterator Вы можете использовать pointer typedef для возвращаемого типа.

1

По вопросам рекламы [email protected]