#include <iostream> 
#include <iterator> 
#include <vector>
#include <algorithm>

template <class T, 
          class charT = char, 
          class traits = std::char_traits<charT> > 
class my_infix_ostream_iterator : 
    public std::iterator<std::output_iterator_tag, void, void, void, void> 
{ 
    std::basic_ostream<charT, traits> *os;
    charT const* delimiter;
    size_t counter, numPerLine; 

public: 
    typedef charT char_type; 
    typedef traits traits_type; 
    typedef std::basic_ostream<charT,traits> ostream_type; 

    my_infix_ostream_iterator(ostream_type& s, size_t numPerLine = 0, charT const *d = 0)
        : os(&s), delimiter(d), numPerLine(numPerLine), counter(0) 
    {} 

    my_infix_ostream_iterator& operator=(T const &item)
    { 
        if (counter > 0)
        {
            if (delimiter)
                *os << delimiter; 
            if ((numPerLine > 0) && ((counter % numPerLine) == 0))
                *os << os->widen('\n');
        }
        *os << item;
        ++counter;
        return *this;
    }

    my_infix_ostream_iterator& operator*() { 
        return *this;
    }

    my_infix_ostream_iterator& operator++() {
        return *this;
    }

    my_infix_ostream_iterator& operator++(int) {
        return *this;
    }
};     

struct myClass
{
	int value;
};

std::ostream& operator<<(std::ostream &os, const myClass &cls)
{
	os << cls.value;
	return os;
}

int main()
{
	std::vector<myClass> myVec = {
		{1}, {2}, {3}, {4}, {5},
		{6}, {7}, {8}, {9}, {10},
		{11}, {12}, {13}
	};

	std::cout << "Using a for loop..." << std::endl;
	
	my_infix_ostream_iterator<myClass> iter(std::cout, 5, ", ");
	for (const auto &elem : myVec) {
	    *iter++ = elem;
	}

	std::cout << std::endl << std::endl;
	
	std::cout << "Using std::copy()..." << std::endl;

	std::copy(myVec.begin(), myVec.end(),
	    my_infix_ostream_iterator<myClass>(std::cout, 5, ", ")
	);

	return 0;
}