Для контейнеров Кенни дал правильное решение.Тем не менее, многие функции в C ++ принимают пары итераторов вместо контейнеров ... ту же логику можно применить здесь.Итераторы используют iterator_traits
для предоставления информации о связанных с ними типах:
template <typename It>
void myfunction(It start, It end) {
// Get value for iterator:
typedef typename std::iterator_traits<It>::value_type T;
// Do something, e.g. calculate the minimum:
T min_value = *std::min_element(start, end);
}
Кстати, typename
необходимо в typedef
, поскольку value_type
является так называемой зависимой тип, т.е. это зависит от природы аргумента шаблона, и компилятор C ++ не может самостоятельно определить, что в этом контексте он ссылается на имя типа (а не, скажем, статический метод или переменную).