Другое решение, основанное на static const
лямбда-функции для функции идентификации.
К сожалению, требуется C ++ 14 (использует универсальную лямбду), но, как вы можете видеть, я также изменил функцию наиспользуйте циклический цикл, чтобы больше не нуждаться в итераторах и работает также для массивов в стиле C.
#include <vector>
#include <iostream>
static const auto l = [](auto item){ return item; };
template <typename C, typename D, typename O, typename F = decltype(l)>
void Join (C const & c, D const & d, O & o, F f = l)
{
bool first { true };
for ( auto const & item : c )
{
if ( first )
first = false;
else
o << d;
o << f(item);
}
}
int main()
{
std::vector<int> v1 { 2, 3, 5, 7, 11, 13, 17 };
int v2[] { 1, 2, 3, 4, 5 };
Join(v1, ',', std::cout);
std::cout << std::endl;
Join(v2, ',', std::cout, [](auto i){ return i+10; });
std::cout << std::endl;
}