fork download
  1. #include <iostream>
  2. #include <functional>
  3.  
  4. template <size_t index, typename... Arg>
  5. struct tuple_impl;
  6.  
  7. template <size_t index>
  8. struct tuple_impl<index> {};
  9.  
  10. template <size_t index, typename T, typename... Arg>
  11. struct tuple_impl<index, T, Arg...>: public tuple_impl<index + 1u, Arg...> {
  12. typedef tuple_impl<index + 1u, Arg...> parent;
  13. typedef T type;
  14. T value_;
  15. tuple_impl(T value, Arg... args): parent(args...), value_(value) {}
  16. tuple_impl() {}
  17. };
  18.  
  19. template <typename... Arg>
  20. struct tuple: public tuple_impl<0u, Arg...> {
  21. typedef tuple_impl<0u, Arg...> parent;
  22. tuple(Arg... args): parent(args...) {}
  23. tuple() {}
  24. };
  25.  
  26. template <size_t index, typename Tuple>
  27. struct tuple_element;
  28.  
  29. template <size_t index, typename T, typename... Arg>
  30. struct tuple_element<index, tuple<T, Arg...> >: public tuple_element<index - 1u, tuple<Arg...> > {
  31. };
  32.  
  33. template <typename T, typename... Arg>
  34. struct tuple_element<0u, tuple<T, Arg...> > {
  35. typedef T type;
  36. };
  37.  
  38. template <size_t index, typename T, typename... Arg>
  39. typename std::add_lvalue_reference<T>::type _get(tuple_impl<index, T, Arg...> &t) {
  40. return t.value_;
  41. }
  42.  
  43. template <size_t index, typename... Arg>
  44. typename std::add_lvalue_reference<typename tuple_element<index, tuple<Arg...> >::type>::type get(tuple<Arg...> &t) {
  45. return _get<index>(t);
  46. }
  47.  
  48. int main() {
  49. tuple<int, char, double> test;
  50. get<0>(test) = 123;
  51. get<1>(test) = 'x';
  52. get<2>(test) = 5.5;
  53. std::cout << get<0>(test) << std::endl;
  54. std::cout << get<1>(test) << std::endl;
  55. std::cout << get<2>(test) << std::endl;
  56. }
Success #stdin #stdout 0s 2928KB
stdin
Standard input is empty
stdout
123
x
5.5