Возможно, вы захотите использовать итераторы. Промежуточный результат может выглядеть следующим образом:
template<typename Iter>
void foo(Iter begin, Iter end) {
using T = decltype(*begin);
std::for_each(begin, end, [] (cons T & t) {
std::out << t << '\n';
}
}
Теперь используется вызываемый шаблон:
template<typename Iter, typename Callable>
void foo(Iter begin, Iter end, Callable & c) {
std::for_each(begin, end, c);
}
Мы только что научились использовать то, что уже предлагает STL.