Как реализовать operator-> для типа итератора?
Есть ли способ реализовать operator- > , а не только оператор *. Чтобы работать с следующим кодом:
Iterator<value> it = ...
i = (*it).get();
i = it->get(); // also works
Предположим, что тип значения имеет метод get.
Когда Итератор реализуется, как показано ниже:
template<T> class Iterator {
T operator*() { return ... }
T operator->() { return ... }
}
Здесь... это реализация получения правильного объекта T.
Как-то это не сработает, когда я реализую его таким образом. Кажется, я что-то неправильно понимаю.
Ответы
Ответ 1
operator->
должен возвращать указатель:
T * operator->();
T const * operator->() const;
operator*
должен вернуть ссылку, если вы хотите использовать ее для изменения:
T & operator*();
T operator*() const; // OR T const & operator*() const;
Ответ 2
Как ни странно, как это может показаться, вы хотите вернуть указатель на T, таким образом:
T * operator->() { return &the_value; }
Или указатель на const.
Ответ 3
Вы не укажете, что означает "он не будет работать" - значит, он не может скомпилировать или сделать что-то еще, чем ожидалось? Я предполагаю, что он компилируется, потому что из вашего фрагмента я не понимаю, почему это не должно.
То, что вы делаете, возвращается по значению. Таким образом, вы возвращаете новый экземпляр объекта с указателем. Вместо этого вы должны вернуть указатель в operator->
и ссылку в operator*