#include <iostream>
#include <tuple>

template<typename Tuple> class wrapped_tuple;
 
template<size_t I, typename Tuple>
typename std::tuple_element<I, Tuple>::type&
Get(wrapped_tuple<Tuple>& w) {
  return std::get<I>(w.tuple_);
}
 
template<typename Tuple> class wrapped_tuple {
  template<size_t I, typename Uple>
  friend typename std::tuple_element<I, Uple>::type&
         ::Get(wrapped_tuple<Uple>& w);
  public:
    wrapped_tuple(Tuple& t) : tuple_(t) {}
  private:
    Tuple& tuple_;
};
 
template<typename Tuple>
wrapped_tuple<Tuple> wrap_tuple(Tuple& tup) {
  return wrapped_tuple<Tuple>(tup);
}
 
int main() {
  using std::get;
  std::tuple<int, double, short> tup(1, 3.14159, 32767);
  auto w = wrap_tuple(tup);
  Get<0>(w) = 7;
  Get<1>(w) *= 2;
  ++Get<2>(w);
  std::cout << get<0>(tup) << ' ' << get<1>(tup) << ' ' << get<2>(tup) << std::endl;
  return 0;
}