2014-02-17 1 views
3

Шаблон 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.Что такое тип вложенного указателя в iterator_traits?

В моем приложении используется ссылка на прокси-итератор прокси-сервера, созданная вручную. Я хочу перейти на использование Boost iterator_facade, который позволяет мне настроить ссылочный тип по умолчанию T& на произвольный тип, но не так для типа указателя, который по умолчанию равен T*. Я хочу избежать укусов каким-то глубоко скрытым использованием вложенного типа pointer.

Примечание: итератор является прокси для встроенного типа без вложенных элементов, так что я не нужна совместимость с operator-> (для которых тип возвращаемого будет pointer).

Вопрос: какая польза случаев есть в стандартной библиотеке для вложенного типа pointer внутри iterator_traits?

+1

Я не нашел использования в исходном SGI STL или в стандарте C++. Возможно, это средство для использования пользователем языка, а не стандартная библиотека. – Rapptz

+1

Вы можете найти его объявленный тип интересным в итераторе, который имеет тип шаблона, специализируется на '' Он по-прежнему 'T *', но 'T' везде еще теряет' * '. – WhozCraig

+0

@WhozCraig tnx хорошая точка, но если бы я просто объявлял 'using pointer = void' для моего собственного итератора, где можно было бы укусить? – TemplateRex

ответ

1

В отличие от первых трех типов 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 d a->, соответственно. [...]

Значения по умолчанию T* и T& для pointer и reference конечно удовлетворяют требованиям итераторов.Что касается ссылок прокси, то Boost.Iterator documentation указывает

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

Обратные типы для iterator_facadeoperator-> и operator[]: не указано. Вместо этого эти типы описываются в терминах набора требований, которые должны выполняться с помощью реализации iterator_facade.

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

 Смежные вопросы

  • Нет связанных вопросов^_^