При написании общих функций для диапазонов "итератор" я обычно делаю:
template <typename Iter> auto func(Iter &first, Iter &last)
{
using IterType = typename std::decay<decltype(*first)>::type;
...
}
Другой способ:
template <typename Iter> auto func(Iter &first, Iter &last)
{
using IterType = typename std::iterator_traits<Iter>::value_type;
...
}
И еще третья:
template <typename Iter> auto func(Iter &first, Iter &last)
{
using IterType = typename Iter::value_type;
...
}
Без применения iterator_traits
.
В теории мои функции должны принимать только итераторы как first
и last
, а вторая форма идеально (imho) - самый идиоматический способ получить тип. Но использует typename std::decay<decltype(*first)>::type
самую общую идиому, чтобы не налагать ограничений на Iter
, как имеющие value_type
, определенные?