fork download
  1. #include <iostream>
  2. #include <tuple>
  3.  
  4. template<typename Tuple> class wrapped_tuple;
  5.  
  6. template<size_t I, typename Tuple>
  7. typename std::tuple_element<I, Tuple>::type&
  8. Get(wrapped_tuple<Tuple>& w) {
  9. return std::get<I>(w.tuple_);
  10. }
  11.  
  12. template<typename Tuple> class wrapped_tuple {
  13. template<size_t I, typename Uple>
  14. friend typename std::tuple_element<I, Uple>::type&
  15. ::Get(wrapped_tuple<Uple>& w);
  16. public:
  17. wrapped_tuple(Tuple& t) : tuple_(t) {}
  18. private:
  19. Tuple& tuple_;
  20. };
  21.  
  22. template<typename Tuple>
  23. wrapped_tuple<Tuple> wrap_tuple(Tuple& tup) {
  24. return wrapped_tuple<Tuple>(tup);
  25. }
  26.  
  27. int main() {
  28. using std::get;
  29. std::tuple<int, double, short> tup(1, 3.14159, 32767);
  30. auto w = wrap_tuple(tup);
  31. Get<0>(w) = 7;
  32. Get<1>(w) *= 2;
  33. ++Get<2>(w);
  34. std::cout << get<0>(tup) << ' ' << get<1>(tup) << ' ' << get<2>(tup) << std::endl;
  35. return 0;
  36. }
Success #stdin #stdout 0s 2928KB
stdin
Standard input is empty
stdout
7 6.28318 -32768