Listing 8
#include <tuple> #include <iomanip> #include <iostream> #include <ostream> using std::tr1::tuple; using std::tr1::get; using std::tr1::tuple_size; using std::tr1::make_tuple; using std::basic_ostream; using std::cout; using std::boolalpha; template <int N> struct writer; template <> struct writer<0> { // handle empty tuple types template <class Ostr, class Tuple> static Ostr& put(Ostr& str, const Tuple& tpl) { // show contents return str; } }; template <> struct writer<1> { // show first element of tuple object template <class Ostr, class Tuple> static Ostr& put(Ostr& str, const Tuple& tpl) { // show contents return str << get<0>(tpl); } }; template <int N> struct writer { // show first N elements of tuple object template <class Ostr, class Tuple> static Ostr& put(Ostr& str, const Tuple& tpl) { // show contents return writer<N-1>::put(str, tpl) << ", " << get<N-1>(tpl); } }; template <class Tuple, class Char, class Traits> basic_ostream<Char, Traits>& write_tuple( basic_ostream<Char, Traits>& str, const Tuple& tpl) { // show contents return writer<tuple_size<Tuple>::value>::put(str, tpl); } int main() { // demonstrate simple meta-programming technique cout << boolalpha; write_tuple(cout, make_tuple(1, 2.0, 3.3, true)); cout << '\n'; return 0; }