template<class T1>
struct tuple<T1, void, void, void> : base<1, T1>
{
tuple(T1 const &a1) : base<1, T1>(a1) { }
template<size_t i> struct g;
template<> struct g<1> { typedef base<1, T1> type; };
template<size_t i> typename g<i>::type::type &get() { return this->base<i>::get(); }
template<size_t i> typename g<i>::type::type const &get() const { return this->base<i>::get(); }
};
template<class R, class P1>
tuple<P1, void, void, void> make_tuple(P1 a1)
{ return tuple<P1, void, void, void>(a1); }
template<class T1, class T2>
struct tuple<T1, T2, void, void> : base<1, T1>, base<2, T2>
{
tuple(T1 const &a1, T2 const &a2) : base<1, T1>(a1), base<2, T2>(a2) { }
template<size_t i> struct g;
template<> struct g<1> { typedef base<1, T1> type; };
template<> struct g<2> { typedef base<2, T2> type; };
template<size_t i> typename g<i>::type::type &get() { return this->base<i>::get(); }
template<size_t i> typename g<i>::type::type const &get() const { return this->base<i>::get(); }
};
template<class R, class P1, class P2>
tuple<P1, P2, void, void> make_tuple(P1 a1, P2 a2)
{ return tuple<P1, P2, void, void>(a1, a2); }
template<class T1, class T2, class T3>
struct tuple<T1, T2, T3, void> : base<1, T1>, base<2, T2>, base<3, T3>
{
tuple(T1 const &a1, T2 const &a2, T3 const &a3) : base<1, T1>(a1), base<2, T2>(a2), base<3, T3>(a3) { }
template<size_t i> struct g;
template<> struct g<1> { typedef base<1, T1> type; };
template<> struct g<2> { typedef base<2, T2> type; };
template<> struct g<3> { typedef base<3, T3> type; };
template<size_t i> typename g<i>::type::type &get() { return this->base<i>::get(); }
template<size_t i> typename g<i>::type::type const &get() const { return this->base<i>::get(); }
};
template<class R, class P1, class P2, class P3>
tuple<P1, P2, P3, void> make_tuple(P1 a1, P2 a2, P3 a3)
{ return tuple<P1, P2, P3, void>(a1, a2, a3); }
template<class T1, class T2, class T3, class T4>
struct tuple<T1, T2, T3, T4> : base<1, T1>, base<2, T2>, base<3, T3>, base<4, T4>
{
tuple(T1 const &a1, T2 const &a2, T3 const &a3, T4 const &a4) : base<1, T1>(a1), base<2, T2>(a2), base<3, T3>(a3), base<4, T4>(a4) { }
template<size_t i> struct g;
template<> struct g<1> { typedef base<1, T1> type; };
template<> struct g<2> { typedef base<2, T2> type; };
template<> struct g<3> { typedef base<3, T3> type; };
template<> struct g<4> { typedef base<4, T4> type; };
template<size_t i> typename g<i>::type::type &get() { return this->base<i>::get(); }
template<size_t i> typename g<i>::type::type const &get() const { return this->base<i>::get(); }
};
template<class R, class P1, class P2, class P3, class P4>
tuple<P1, P2, P3, P4> make_tuple(P1 a1, P2 a2, P3 a3, P4 a4)
{ return tuple<P1, P2, P3, P4>(a1, a2, a3, a4); }