Как извлечь параметр value_type из параметров шаблона (std::vector и простой указатель)?

У меня есть вид со следующим интерфейсом:

template< class RandomIt >
void my_sort( RandomIt first, RandomIt last )
{
}

Я ожидаю, что RandomIt будет итератором из std::vector<t>.begin()/end()</t> или простым указателем типа T* first,T* last. Я думаю, если я предполагаю, что RandomIt является вектором, я могу получить его из RandomIt::value_type, но тогда это не будет работать для T* first,T* last.

Мой вопрос: как я могу извлечь value_type T из параметра шаблона в обоих случаях?

2 ответа

Используйте iterator_traits<t>::value_type</t> (cppreference). Обратите внимание, что стандартная библиотека предоставляет определения iterator_traits для T* и const T*, поэтому она также работает с простыми указателями.


Поскольку вы используете С++ 11, вы можете применить decltype к самому итератору, чтобы получить value_type:

typedef decltype(*first) value_type;

Примечание iterator_traits может не работать для типов, определенных программистом, если программист не специализируется на iterator_traits для своих итераторов, или он не определяет соответствие итератора стандартным требованиям.

Однако трюк decltype будет работать даже тогда.

licensed under cc by-sa 3.0 with attribution.