2016-05-12 8 views
0

Таким образом, в интересах создания Minimal. Complete, Verifiable Example я создал игрушку 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

Кстати, оператор prefix ++ должен возвращать 'foo &' вместо 'const foo &' или вы не сможете выполнить '++ (++ i)' - и в нем отсутствует оператор 'return' , –

ответ

1
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, вы можете использовать typedef pointer для возвращаемого типа. Использование

+1

За исключением примера, итератор фактически имитирует контейнер 'const string' ... –

+0

@ DanielSchepler Я не был уверен, что это была ошибка OP или нет. Они используют 'std :: string' для параметра шаблона' iterator', который делает 'iterator :: pointer' a' std :: string * ', и я считаю, что класс должен фактически хранить элемент данных как' pointer _foo; '. – NathanOliver

 Смежные вопросы

  • Нет связанных вопросов^_^