1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <set>
namespace utility
{
// note: converting constructor, implicit conversion from T to wrapper<T>
template < typename T > struct wrapper { const T& v ; wrapper( const T& v ) noexcept : v(v) {} };
template< typename T1, typename T2 > // overload for wrapper<> will be found via ADL
std::ostream& operator<< ( std::ostream& stm, const wrapper< std::pair<T1,T2> >& h )
{ return stm << "[" << h.v.first << ", " << h.v.second << "]"; }
template< typename T, typename A > // overload for wrapper<> will be found via ADL
std::ostream& operator<< ( std::ostream& stm, const wrapper< std::vector<T,A> >& h )
{
stm << "[ " ;
for( const auto& value : h.v ) stm << value << ' ' ;
return stm << "] (size:" << h.v.size() << ')';
}
template < typename T >
using wrapping_ostream_iterator = std::ostream_iterator< utility::wrapper<T> > ;
}
template < typename SEQ >
auto make_ostream_iterator( const SEQ&, std::ostream& stm, const char* cstr )
{ return utility::wrapping_ostream_iterator< typename SEQ::value_type >{ stm, cstr } ; }
int main()
{
const std::vector< std::pair<int,double> > vec { {10, 10.1}, {20, 20.2}, {30, 3} };
std::copy( vec.begin(), vec.end(), make_ostream_iterator( vec, std::cout, " " ) ) ;
std::cout << "\n\n" ;
const std::set< std::vector<int> > set { {0,1,2}, {3,4}, {5,6,7,8}, {}, {9,10,11} } ;
std::copy( set.begin(), set.end(), make_ostream_iterator( set, std::cout, "\n" ) ) ;
}
|