Как реализовать operator-> для типа итератора? - PullRequest
12 голосов
/ 25 января 2012

Есть ли способ реализовать оператор->, а не только оператор *.Чтобы следующий код работал:

Iterator<value> it = ...
i = (*it).get();
i = it->get(); // also works

Допустим, у типа значения есть метод get.Когда Iterator реализован, как показано ниже:

template<T> class Iterator {
    T operator*() { return ... }
    T operator->()  { return ... }
 }

Здесь ... - реализация получения правильного объекта T.

Каким-то образом это не будет работать, когда я реализую его таким образом.Я думаю, что я что-то неправильно понимаю.

Ответы [ 3 ]

18 голосов
/ 25 января 2012

operator-> должен вернуть указатель:

T * operator->();
T const * operator->() const;

operator* должен возвращать ссылку, если вы хотите использовать ее для модификации:

T & operator*();
T operator*() const; // OR T const & operator*() const;
4 голосов
/ 25 января 2012

Как бы странно это ни казалось, вы хотите вернуть указатель на T, таким образом:

T * operator->() { return &the_value; }

Или указатель на констант.

2 голосов
/ 25 января 2012

Вы не указываете, что означает "это не сработает" - не скомпилируется или что-то еще, чем ожидалось?Я предполагаю, что он компилируется, потому что из вашего фрагмента я не могу понять, почему он не должен.

То, что вы делаете, возвращает со значением .Таким образом, вы возвращаете новый экземпляр указанного объекта.Вместо этого вы должны вернуть указатель в operator-> и ссылку в operator*

...