#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUdXBsZT4gY2xhc3Mgd3JhcHBlZF90dXBsZTsKIAp0ZW1wbGF0ZTxzaXplX3QgSSwgdHlwZW5hbWUgVHVwbGU+CnR5cGVuYW1lIHN0ZDo6dHVwbGVfZWxlbWVudDxJLCBUdXBsZT46OnR5cGUmCkdldCh3cmFwcGVkX3R1cGxlPFR1cGxlPiYgdykgewogIHJldHVybiBzdGQ6OmdldDxJPih3LnR1cGxlXyk7Cn0KIAp0ZW1wbGF0ZTx0eXBlbmFtZSBUdXBsZT4gY2xhc3Mgd3JhcHBlZF90dXBsZSB7CiAgdGVtcGxhdGU8c2l6ZV90IEksIHR5cGVuYW1lIFVwbGU+CiAgZnJpZW5kIHR5cGVuYW1lIHN0ZDo6dHVwbGVfZWxlbWVudDxJLCBVcGxlPjo6dHlwZSYKICAgICAgICAgOjpHZXQod3JhcHBlZF90dXBsZTxVcGxlPiYgdyk7CiAgcHVibGljOgogICAgd3JhcHBlZF90dXBsZShUdXBsZSYgdCkgOiB0dXBsZV8odCkge30KICBwcml2YXRlOgogICAgVHVwbGUmIHR1cGxlXzsKfTsKIAp0ZW1wbGF0ZTx0eXBlbmFtZSBUdXBsZT4Kd3JhcHBlZF90dXBsZTxUdXBsZT4gd3JhcF90dXBsZShUdXBsZSYgdHVwKSB7CiAgcmV0dXJuIHdyYXBwZWRfdHVwbGU8VHVwbGU+KHR1cCk7Cn0KIAppbnQgbWFpbigpIHsKICB1c2luZyBzdGQ6OmdldDsKICBzdGQ6OnR1cGxlPGludCwgZG91YmxlLCBzaG9ydD4gdHVwKDEsIDMuMTQxNTksIDMyNzY3KTsKICBhdXRvIHcgPSB3cmFwX3R1cGxlKHR1cCk7CiAgR2V0PDA+KHcpID0gNzsKICBHZXQ8MT4odykgKj0gMjsKICArK0dldDwyPih3KTsKICBzdGQ6OmNvdXQgPDwgZ2V0PDA+KHR1cCkgPDwgJyAnIDw8IGdldDwxPih0dXApIDw8ICcgJyA8PCBnZXQ8Mj4odHVwKSA8PCBzdGQ6OmVuZGw7CiAgcmV0dXJuIDA7Cn0=