#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;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8c3RyaW5nPgoKICAgIG5hbWVzcGFjZSBkZXRhaWwKICAgIHsKICAgICAgICAgIHRlbXBsYXRlPGludCAuLi4gTj4gCiAgICAgICAgICBzdHJ1Y3Qgc2VxIAogICAgICAgICAgeyAKICAgICAgICAgICAgIHVzaW5nIHR5cGUgPSBzZXE8Ti4uLj47IAogICAgICAgICAgICAgdGVtcGxhdGU8aW50IEk+CiAgICAgICAgICAgICBzdHJ1Y3QgcHVzaF9iYWNrIDogc2VxPE4uLi4sIEk+IHt9OwogICAgICAgICAgfTsKCiAgICAgICAgICB0ZW1wbGF0ZTxpbnQgTj4gCiAgICAgICAgICBzdHJ1Y3QgZ2Vuc2VxIDogZ2Vuc2VxPE4tMT46OnR5cGU6OnRlbXBsYXRlIHB1c2hfYmFjazxOLTE+IHt9OwoKICAgICAgICAgIHRlbXBsYXRlPD4gCiAgICAgICAgICBzdHJ1Y3QgZ2Vuc2VxPDA+IDogc2VxPD4ge307CgogICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uIFR5cGVzLCBpbnQgLi4uTj4KICAgICAgICAgIHZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtICYgb3V0LCBzdGQ6OnR1cGxlPFR5cGVzLi4uPiBjb25zdCAmIHQsIHNlcTxOLi4uPikKICAgICAgICAgIHsKICAgICAgICAgICAgIGF1dG8gc2luayA9IHsKICAgICAgICAgICAgIAkgICAgICAgICAgKG91dCA8PCAieyIsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgIChvdXQgPDwgKE4/IiwiOiIiKSA8PCBzdGQ6OmdldDxOPih0KSAsIDApLi4uLAogICAgICAgICAgICAgICAgICAgICAgICAgIChvdXQgPDwgIn0iLCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgIH0KICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLiBUeXBlcz4KICAgIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJiBvdXQsIHN0ZDo6dHVwbGU8VHlwZXMuLi4+IGNvbnN0ICYgdCkKICAgIHsKICAgICAgIGRldGFpbDo6cHJpbnQob3V0LCB0LCB0eXBlbmFtZSBkZXRhaWw6OmdlbnNlcTxzaXplb2YuLi4oVHlwZXMpPjo6dHlwZSgpKTsKICAgICAgIHJldHVybiBvdXQ7CiAgICB9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6Y291dCA8PCBzdGQ6Om1ha2VfdHVwbGUoMTAsIDIwLjAsIHN0ZDo6c3RyaW5nKCJOYXdheiIpKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjptYWtlX3R1cGxlKDEwLCAyMC4wLCBzdGQ6OnN0cmluZygiTmF3YXoiKSwgOTA4OSkgPDwgc3RkOjplbmRsOwp9