std::iterator_traits
Шаблон класса определяет 5 вложенных типов: iterator_category
, value_type
, difference_type
, pointer
а также reference
, Просмотр источников <algorithm>
заголовок обоих libc ++ и libstdc ++, можно увидеть множество применений value_type
, difference_type
а также iterator_category
, но только один для reference
(внутри std::iter_swap
) и ни для pointer
,
Мое приложение использует созданную вручную пару итератор / прокси-сервер. Я хочу перейти на использование Boost iterator_facade
который позволяет мне настроить тип ссылки по умолчанию T&
к произвольному типу, но не так для типа указателя, который T*
по умолчанию. Я хочу избежать укусов глубоко скрытого использования вложенных pointer
тип.
Заметка: итератор является прокси для встроенного типа без вложенных членов, поэтому мне не нужна совместимость с operator->
(для которого тип возврата будет pointer
).
Вопрос: какие варианты использования есть в стандартной библиотеке для вложенного типа pointer
внутри iterator_traits
?
В отличие от первых трех типов iterator_category
, value_type
а также difference_type
(которые широко используются стандартными алгоритмами для отправки тегов в эффективные версии в зависимости от возможностей итератора) последние два типа pointer
а также reference
внутри iterator_traits
похоже, не используются никакими алгоритмами, но используются для определения соответствия требованиям итератора.
24.2.1 В общем [iterator.requirements.general]
1 [..] Все итераторы
i
для которого выражение(*i).m
является
хорошо определены, поддерживают выражениеi->m
с той же семантикой, что и
(*i).m
, […]
24.4.1 Черты итератора [iterator.traits]
[…] Кроме того, типыiterator_traits<Iterator>::reference iterator_traits<Iterator>::pointer
определяется как итератор
ссылочный и указатель типов, то есть для объекта итератораa
,
тот же тип, что и тип*a
а такжеa->
соответственно. […]
Значения по умолчанию T*
а также T&
за pointer
а также reference
конечно, удовлетворить требования итератора. Что касается прокси-ссылок, то Boost.Iterator документация определяет
reference
тип читаемого итератора (и сегодняшний входной итератор)
на самом деле не должны быть ссылкой, если он обратим в
итератораvalue_type
, Когдаvalue_type
это класс, однако, это
все еще должна быть возможность доступа к членам черезoperator->
,
Поэтому итератор которогоreference
тип на самом деле не является ссылкой
должен вернуть прокси, содержащий копию указанного значения из его
operator->
,Типы возврата для
iterator_facade
«soperator->
а такжеoperator[]
являются
не указано явно Вместо этого эти типы описаны в терминах
набора требований, которые должны быть удовлетворены
iterator_facade
реализация.
Заключение: пока прокси-итератор не требует доступа к членам своего базового value_type
через .m
или же ->m
не нужно беспокоиться о pointer
введите внутри iterator_traits
и даже если кто-то использует прокси-итераторы, boost::iterator_facade
будет делать правильные вещи.
Других решений пока нет …