Подтвердить что ты не робот

Получение const_iterator из итератора

Есть ли метафунк f, который сопоставляет iterator с его соответствующим const_iterator?

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

4b9b3361

Ответ 1

Мне не известно о таком метафоре.

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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