Как получить тип значения из итератора в С++?
Мой вопрос обязательно прост для любого, кто знаком с синтаксисом С++. Я просто изучаю С++, и это какая-то домашняя работа.
template<typename Iter>
void quickSort(Iter begin, Iter end)
{
//..
auto pivot = * ( begin + (end - begin)/2 );
//..
}
pivot должен содержать значение из центра интервала [begin, end]. Ite
Код, который я написал там, работает, но auto
- это ключевое слово из нового стандартного языка. Как это сделать по-старому? Что писать вместо auto
?
Ответы
Ответ 1
typename std::iterator_traits<Iter>::value_type
Это будет работать, если ваш шаблон создается с помощью Iter
в качестве типа указателя.
Кстати, typename
не является частью самого типа. Он сообщает компилятору, что value_type
действительно является типом. Если это было имя функции или статического члена данных, это влияет на синтаксис. Компилятор не обязательно знает, что это такое, поскольку специализация iterator_traits
для Iter
может не отображаться при компиляции шаблона.
Ответ 2
Ответ Стива прав; в С++ 98 вам нужно использовать std:: iterator_traits или вы можете использовать Iter:: value_type, если знаете, что итератор имеет этот typedef (например, выведен из std:: iterator).
Однако в вашем коде есть еще одна проблема: вы обычно не можете просто делить итераторы. Это, конечно, работает с указателями, но не в более общем случае. Более общий подход:
Iter itPivot = std::advance(begin, std::distance(begin, end)/2);