#include #include #include #include /////////////////////////////////////////////////////////////////////////////// // Manipulators /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // basic_io_format /////////////////////////////////////////////////////////////////////////////// template class basic_io_format { private: typedef std::basic_string StringType; public: basic_io_format(const StringType &s,const StringType &e,const StringType &d) : start(s),end(e),delimiter(d) {} template friend std::basic_ostream &operator<< (std::basic_ostream &stream,const basic_io_format &object) { format(stream)=object; return stream; } template static basic_io_format &format(std::basic_ostream &stream) { void *&void_ptr=stream.pword(format_index()); if(!void_ptr) void_ptr=new basic_io_format(StringType(),StringType(),StringType()); return *static_cast(void_ptr); } private: static int format_index() { static int index=std::ios_base::xalloc(); return index; } public: StringType start; StringType end; StringType delimiter; }; /////////////////////////////////////////////////////////////////////////////// // io_format /////////////////////////////////////////////////////////////////////////////// template struct io_format : basic_io_format { io_format(const std::string &start,const std::string &end,const std::string &delimiter) : basic_io_format(start,end,delimiter) {} }; /////////////////////////////////////////////////////////////////////////////// // wio_format /////////////////////////////////////////////////////////////////////////////// template struct wio_format : basic_io_format { wio_format(const std::wstring &start,const std::wstring &end,const std::wstring &delimiter) : basic_io_format(start,end,delimiter) {} }; template std::basic_ostream &operator<< (std::basic_ostream &,const std::vector &); template std::basic_ostream &operator<< (std::basic_ostream &,const std::pair &); namespace detail { /////////////////////////////////////////////////////////////////////////////// // print_container /////////////////////////////////////////////////////////////////////////////// template void print_container(std::basic_ostream &stream,const Container &container) { typedef basic_io_format format_type; const format_type &format=format_type::format(stream); stream << format.start; const typename Container::const_iterator end=container.end(); typename Container::const_iterator i=container.begin(); if(i!=end) stream << *i; while(++i, i!=end) stream << format.delimiter << *i; stream << format.end; } } /////////////////////////////////////////////////////////////////////////////// // operator<<(stream,std::vector) /////////////////////////////////////////////////////////////////////////////// template std::basic_ostream &operator<< (std::basic_ostream &stream,const std::vector &v) { detail::print_container(stream,v); return stream; } /////////////////////////////////////////////////////////////////////////////// // operator<<(stream,std::pair) /////////////////////////////////////////////////////////////////////////////// template std::basic_ostream &operator<< (std::basic_ostream &stream,const std::pair &p) { typedef basic_io_format > format_type; const format_type &format=format_type::format(stream); return stream << format.start << p.first << format.delimiter << p.second << format.end; } int main() { typedef std::pair Map; typedef std::vector MapList; MapList list; list.push_back(std::make_pair(1,'A')); list.push_back(std::make_pair(2,'B')); list.push_back(std::make_pair(3,'C')); std::cout << io_format("[","]",",") << io_format("","","\n") << list << '\n'; }