Как реализовать 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*