2017-01-15 10 views
3

Я создаю тип, который моделирует InputIterator. В моем приложении «пропустить первые сотни тысяч элементов» - это разумная вещь, и создание value_type дорого, поэтому я хочу, чтобы мой итератор создал value_type только при разыменовании, а не при увеличении.Создание InputIterator, который не сохраняет value_type

Я мог бы легко сделать operator* вернуть значение value_type. Но я не знаю, что делать с operator->. Как я могу вернуть указатель, если мой итератор не сохраняет value_type? Я боюсь жизненных проблем с указателем на временное и не хочу, чтобы меня сожгли.

Я думал об отсутствии operator->, но тогда у меня не было бы полного InputIterator.

+0

Почему вы не храните указатель на 'value_type' в своем итераторе и выделяете его только при необходимости? Я имею в виду что-то вроде «ленивой загрузки». – MRB

+0

Вы все равно можете сохранить объект 'value_type', но создать его только после первого разыменования. С чем-то вроде ['std :: optional'] (http://en.cppreference.com/w/cpp/experimental/optional). – BoBTFish

+0

Я нахожусь в C++ 14, поэтому у меня нет 'std :: optional'. Но даже если бы я и сделал, значение_имя велико и сделает итератор большим. –

ответ

0

Я считаю, что он будет работать, чтобы вернуть прокси-объект по значению из operator-> итератора. Прокси-сервер будет иметь один элемент данных value_type, а его собственный operator-> вернет указатель на этот элемент данных.

Срок службы прокси-объекта такой же, как и любой другой объект возврата по значению (например, мой план для operator*), поэтому, хотя у меня есть указатель на временный, в этих обстоятельствах он потребляется до объекта прокси разрушается.