Ответ 1
Мне не известно о таком метафоре.
Не все итераторы имеют соответствующий const_iterator. Например. insert_iterator. Таким образом, такой метафорум должен будет решить, что он собирается делать в таких случаях.
Есть ли метафунк f
, который сопоставляет iterator
с его соответствующим const_iterator
?
т.е. f<std::vector<T>::iterator>::type
должен давать std::vector<T>::const_iterator
.
Мне не известно о таком метафоре.
Не все итераторы имеют соответствующий const_iterator. Например. insert_iterator. Таким образом, такой метафорум должен будет решить, что он собирается делать в таких случаях.
Я могу что-то придумать для reverse_iterator
: используя функцию члена base
decltype
, можно было бы вернуть возвращаемый тип, чтобы вернуться к iterator
.
Однако для iterator
/const_iterator
нет такой функции, поэтому трудно понять, как это можно было бы достичь, не доставляя внутренний typedef или требуя явной специализации.
Я думаю, что общее решение вашей проблемы (и одно, которое также будет переносимым, невозможно). По крайней мере, я не могу себе представить: -).
Трудная проблема заключается в том, что контейнер определяет тип const_iterator. Чтобы перейти к типу const_iterator для контейнера, вы должны определить тип контейнера.
Однако, если вы начинаете с типа итератора контейнера в качестве параметра metafunction, невозможно получить тип контейнера.
Для известных T (s) то, что вы хотите, может быть достигнуто, однако...
Я не думаю, что это возможно, так как часто нет корректного отображения между типами итераторов. Например, два контейнера могут совместно использовать не-const-тип итератора, но имеют разные константные итераторы. В общем случае вы можете отображать только типы контейнеров в типы итераторов, но не между типами итераторов или от типа итератора до типа контейнера.