fork download
  1. #include <cstddef>
  2. #include <iostream>
  3. #include <tuple>
  4.  
  5.  
  6. #include <cstdint>
  7. #include <type_traits>
  8. #include <tuple>
  9.  
  10. template <typename T, typename Tuple> struct get_index;
  11.  
  12. template <typename T, typename... Ts>
  13. struct get_index<T, std::tuple<T, Ts...>> : std::integral_constant<std::size_t, 0> {};
  14.  
  15. template <typename T, typename Tail, typename... Ts>
  16. struct get_index<T, std::tuple<Tail, Ts...>> :
  17. std::integral_constant<std::size_t, 1 + get_index<T, std::tuple<Ts...>>::value> {};
  18.  
  19.  
  20. struct A
  21. {
  22. std::size_t size() { return 3; }
  23. };
  24.  
  25. struct B
  26. {
  27. std::size_t size() { return 2; }
  28. };
  29.  
  30. struct C
  31. {
  32. std::size_t size() { return 4; }
  33. };
  34.  
  35. template <typename Tuple> struct Foo
  36. {
  37. const Tuple& tuple_;
  38. std::array<int, std::tuple_size<Tuple>::value> array_;
  39.  
  40. Foo(const Tuple& tuple)
  41. : tuple_(tuple)
  42. {
  43. std::cout << init() << '\n';
  44. }
  45.  
  46. ////////////////////////////////////////////////////////////////////////////////////////////////////
  47.  
  48. template <std::size_t INDEX = 0>
  49. typename std::enable_if<std::tuple_size<Tuple>::value == INDEX, std::size_t>::type init()
  50. {
  51. return 0;
  52. }
  53.  
  54. ////////////////////////////////////////////////////////////////////////////////////////////////////
  55.  
  56. template <std::size_t INDEX = 0>
  57. typename std::enable_if<std::tuple_size<Tuple>::value != INDEX, std::size_t>::type init()
  58. {
  59. auto offset = init<INDEX + 1>();
  60.  
  61. std::cout << "index: " << INDEX << "; offset: " << offset << '\n';
  62.  
  63. array_[INDEX] = offset;
  64.  
  65. return offset + std::get<INDEX>(tuple_).size();
  66. }
  67.  
  68. template <typename T>
  69. std::size_t
  70. offset(const T&)
  71. {
  72. return array_[get_index<T&, Tuple>::value];
  73. }
  74. };
  75.  
  76. int main()
  77. {
  78. A a;
  79. B b;
  80. C c;
  81. auto t = std::tie(a, b, c);
  82. using T = decltype(t);
  83. Foo<T> foo(t);
  84.  
  85. std::cout << foo.offset(a) << '\n';
  86. std::cout << foo.offset(b) << '\n';
  87. std::cout << foo.offset(c) << '\n';
  88. }
  89.  
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
index: 2; offset: 0
index: 1; offset: 4
index: 0; offset: 6
9
6
4
0