Получение const_iterator от итератора - PullRequest
12 голосов
/ 24 февраля 2011

Существует ли метафункция f, которая отображает iterator на соответствующий const_iterator?

т.е. f<std::vector<T>::iterator>::type должно дать std::vector<T>::const_iterator.

Ответы [ 4 ]

4 голосов
/ 24 февраля 2011

Я не знаю о такой метафункции.

Не у всех итераторов есть соответствующий const_iterator. Например. insert_iterator. Таким образом, такая метафункция должна была бы решить, что она собирается делать в таких случаях.

0 голосов
/ 24 февраля 2011

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

0 голосов
/ 24 февраля 2011

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

Сложная проблема в том, что контейнер определяет тип const_iterator. Чтобы добраться до типа const_iterator для контейнера, вы должны определить тип контейнера.

Однако, если вы начнете с типа итератора контейнера в качестве параметра мета-функции, получить тип контейнера невозможно.

Для известных T (s) то, чего вы хотите, может быть достигнуто, однако ...

0 голосов
/ 24 февраля 2011

Я могу придумать что-нибудь для reverse_iterator: используя функцию-член base для decltype, можно извлечь тип возврата, чтобы вернуться к iterator.

Однако для iterator / const_iterator такой функции не существует, поэтому трудно понять, как этого можно добиться, если не предоставить внутренний typedef или не требуется явная специализация.

...