Какая польза от типа вложенного указателя в iterator_traits?

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?

6

Решение

В отличие от первых трех типов 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«s operator-> а также operator[] являются
не указано явно Вместо этого эти типы описаны в терминах
набора требований, которые должны быть удовлетворены
iterator_facade реализация.

Заключение: пока прокси-итератор не требует доступа к членам своего базового value_type через .m или же ->mне нужно беспокоиться о pointer введите внутри iterator_traitsи даже если кто-то использует прокси-итераторы, boost::iterator_facade будет делать правильные вещи.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]