template <size_t remain>
struct helper
{
  template <typename... Ts>
  static void read(istream& is, tuple<Ts...>& t){
    is >> get<sizeof...(Ts) - remain>(t);
    helper<remain-1>::read(is, t);
  }
};

template <>
struct helper<0>
{
  template <typename... Ts>
  static void read(istream& is, tuple<Ts...>& t){}
};

template <typename... Ts>
istream& operator>>(istream& is, tuple<Ts...>& t) {
  helper<sizeof...(Ts)>::read(is, t);
  return is;
}