#include <iostream>
#include <functional>
template <size_t index, typename... Arg>
struct tuple_impl;
template <size_t index>
struct tuple_impl<index> {};
template <size_t index, typename T, typename... Arg>
struct tuple_impl<index, T, Arg...>: public tuple_impl<index + 1u, Arg...> {
typedef tuple_impl<index + 1u, Arg...> parent;
typedef T type;
T value_;
tuple_impl(T value, Arg... args): parent(args...), value_(value) {}
tuple_impl() {}
};
template <typename... Arg>
struct tuple: public tuple_impl<0u, Arg...> {
typedef tuple_impl<0u, Arg...> parent;
tuple(Arg... args): parent(args...) {}
tuple() {}
};
template <size_t index, typename Tuple>
struct tuple_element;
template <size_t index, typename T, typename... Arg>
struct tuple_element<index, tuple<T, Arg...> >: public tuple_element<index - 1u, tuple<Arg...> > {
};
template <typename T, typename... Arg>
struct tuple_element<0u, tuple<T, Arg...> > {
typedef T type;
};
template <size_t index, typename T, typename... Arg>
typename std::add_lvalue_reference<T>::type _get(tuple_impl<index, T, Arg...> &t) {
return t.value_;
}
template <size_t index, typename... Arg>
typename std::add_lvalue_reference<typename tuple_element<index, tuple<Arg...> >::type>::type get(tuple<Arg...> &t) {
return _get<index>(t);
}
int main() {
tuple<int, char, double> test;
get<0>(test) = 123;
get<1>(test) = 'x';
get<2>(test) = 5.5;
std::cout << get<0>(test) << std::endl;
std::cout << get<1>(test) << std::endl;
std::cout << get<2>(test) << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnRlbXBsYXRlIDxzaXplX3QgaW5kZXgsIHR5cGVuYW1lLi4uIEFyZz4Kc3RydWN0IHR1cGxlX2ltcGw7Cgp0ZW1wbGF0ZSA8c2l6ZV90IGluZGV4PgpzdHJ1Y3QgdHVwbGVfaW1wbDxpbmRleD4ge307Cgp0ZW1wbGF0ZSA8c2l6ZV90IGluZGV4LCB0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmc+CnN0cnVjdCB0dXBsZV9pbXBsPGluZGV4LCBULCBBcmcuLi4+OiBwdWJsaWMgdHVwbGVfaW1wbDxpbmRleCArIDF1LCBBcmcuLi4+IHsKICAgIHR5cGVkZWYgdHVwbGVfaW1wbDxpbmRleCArIDF1LCBBcmcuLi4+IHBhcmVudDsKCXR5cGVkZWYgVCB0eXBlOwoJVCB2YWx1ZV87Cgl0dXBsZV9pbXBsKFQgdmFsdWUsIEFyZy4uLiBhcmdzKTogcGFyZW50KGFyZ3MuLi4pLCB2YWx1ZV8odmFsdWUpIHt9Cgl0dXBsZV9pbXBsKCkge30KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmc+CnN0cnVjdCB0dXBsZTogcHVibGljIHR1cGxlX2ltcGw8MHUsIEFyZy4uLj4gewoJdHlwZWRlZiB0dXBsZV9pbXBsPDB1LCBBcmcuLi4+IHBhcmVudDsKCXR1cGxlKEFyZy4uLiBhcmdzKTogcGFyZW50KGFyZ3MuLi4pIHt9Cgl0dXBsZSgpIHt9Cn07Cgp0ZW1wbGF0ZSA8c2l6ZV90IGluZGV4LCB0eXBlbmFtZSBUdXBsZT4Kc3RydWN0IHR1cGxlX2VsZW1lbnQ7Cgp0ZW1wbGF0ZSA8c2l6ZV90IGluZGV4LCB0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmc+CnN0cnVjdCB0dXBsZV9lbGVtZW50PGluZGV4LCB0dXBsZTxULCBBcmcuLi4+ID46IHB1YmxpYyB0dXBsZV9lbGVtZW50PGluZGV4IC0gMXUsIHR1cGxlPEFyZy4uLj4gPiB7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJnPgpzdHJ1Y3QgdHVwbGVfZWxlbWVudDwwdSwgdHVwbGU8VCwgQXJnLi4uPiA+IHsKCXR5cGVkZWYgVCB0eXBlOwp9OwoKdGVtcGxhdGUgPHNpemVfdCBpbmRleCwgdHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJnPgp0eXBlbmFtZSBzdGQ6OmFkZF9sdmFsdWVfcmVmZXJlbmNlPFQ+Ojp0eXBlIF9nZXQodHVwbGVfaW1wbDxpbmRleCwgVCwgQXJnLi4uPiAmdCkgewoJcmV0dXJuIHQudmFsdWVfOwp9Cgp0ZW1wbGF0ZSA8c2l6ZV90IGluZGV4LCB0eXBlbmFtZS4uLiBBcmc+CnR5cGVuYW1lIHN0ZDo6YWRkX2x2YWx1ZV9yZWZlcmVuY2U8dHlwZW5hbWUgdHVwbGVfZWxlbWVudDxpbmRleCwgdHVwbGU8QXJnLi4uPiA+Ojp0eXBlPjo6dHlwZSBnZXQodHVwbGU8QXJnLi4uPiAmdCkgewoJcmV0dXJuIF9nZXQ8aW5kZXg+KHQpOwp9CgppbnQgbWFpbigpIHsKCXR1cGxlPGludCwgY2hhciwgZG91YmxlPiB0ZXN0OwoJZ2V0PDA+KHRlc3QpID0gMTIzOwoJZ2V0PDE+KHRlc3QpID0gJ3gnOwoJZ2V0PDI+KHRlc3QpID0gNS41OwoJc3RkOjpjb3V0IDw8IGdldDwwPih0ZXN0KSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgZ2V0PDE+KHRlc3QpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBnZXQ8Mj4odGVzdCkgPDwgc3RkOjplbmRsOwp9