
#include <iostream>
#include <tuple>
#include <string>

    namespace detail
    {
          template<int ... N> 
          struct seq 
          { 
             using type = seq<N...>; 
             template<int I>
             struct push_back : seq<N..., I> {};
          };

          template<int N> 
          struct genseq : genseq<N-1>::type::template push_back<N-1> {};

          template<> 
          struct genseq<0> : seq<> {};

          template<typename ... Types, int ...N>
          void print(std::ostream & out, std::tuple<Types...> const & t, seq<N...>)
          {
             auto sink = {
             	          (out << "{", 0),
                          (out << (N?",":"") << std::get<N>(t) , 0)...,
                          (out << "}", 0)
                         };
          }
    }
    template<typename ... Types>
    std::ostream& operator<<(std::ostream & out, std::tuple<Types...> const & t)
    {
       detail::print(out, t, typename detail::genseq<sizeof...(Types)>::type());
       return out;
    }

int main()
{
    std::cout << std::make_tuple(10, 20.0, std::string("Nawaz")) << std::endl;
    std::cout << std::make_tuple(10, 20.0, std::string("Nawaz"), 9089) << std::endl;
}