tuple(const tuple<VValues...>& other) : m_head(other.head()), inherited(other.tail()) {}
static const_type get(const tuple<Head, Values...>& t){ return t.head(); }
static type get(tuple<Head, Values...>& t) { return t.head(); }
bool operator<(const tuple<T, TTail...>& t, const tuple<U, UTail...>& u) { return (t.head() < u.head() || (!(t.head() < u.head()) && t.tail() < u.tail())); }
bool operator==(const tuple<T, TTail...>& t, const tuple<U, UTail...>& u) { return t.head() == u.head() && t.tail() == u.tail(); }
static PJ get(const tuple<Head, Values...>& t) { return t.head(); }