fork download
  1. #include <iostream>
  2. #include <tuple>
  3.  
  4. template <std::size_t ... Is>
  5. struct accum_mul;
  6.  
  7. template <>
  8. struct accum_mul<> : std::integral_constant<std::size_t, 1u>{};
  9.  
  10. template <std::size_t I, std::size_t ... Is>
  11. struct accum_mul<I, Is...> :
  12. std::integral_constant<std::size_t, I * accum_mul<Is...>::value>{};
  13.  
  14. template <typename Seq, typename Res = std::tuple<>>
  15. struct coeff;
  16.  
  17. template <typename Res>
  18. struct coeff<std::index_sequence<>, Res> {
  19. using type = Res;
  20. };
  21.  
  22. template <std::size_t I, std::size_t ... Is, typename ... TRes>
  23. struct coeff<std::index_sequence<I, Is...>,
  24. std::tuple<TRes...>>
  25. : coeff<std::index_sequence<Is...>,
  26. std::tuple<TRes..., accum_mul<Is...>>> {};
  27.  
  28. template <std::size_t I, typename coeffs, typename dims, typename Seq>
  29. struct to_multi_index;
  30.  
  31. template <std::size_t I, typename coeffs, typename dims, std::size_t... Is>
  32. struct to_multi_index<I, coeffs, dims, std::index_sequence<Is...>>
  33. {
  34. using type = std::index_sequence<(I / (std::tuple_element<Is, coeffs>::type::value)
  35. % (std::tuple_element<Is, dims>::type::value))...>;
  36. };
  37.  
  38. template <typename Indexes, typename coeffs, typename dims, typename dim_indexes>
  39. struct to_multi_indexes;
  40.  
  41. template <std::size_t... Is, typename coeffs, typename dims, typename dim_indexes>
  42. struct to_multi_indexes<std::index_sequence<Is...>, coeffs, dims, dim_indexes>
  43. {
  44. using type = std::tuple<typename to_multi_index<Is, coeffs, dims, dim_indexes>::type...>;
  45. };
  46.  
  47. template <std::size_t...Is>
  48. struct all_indexes
  49. {
  50. private:
  51. using as_seq = std::index_sequence<Is...>;
  52. using as_tuple = std::tuple<std::integral_constant<std::size_t, Is>...>;
  53. using dim_index = std::make_index_sequence<sizeof...(Is)>;
  54. using coeffs = typename coeff<as_seq>::type;
  55. using elem_count = accum_mul<Is...>;
  56. using index_seq = std::make_index_sequence<elem_count::value>;
  57. public:
  58. using type = typename to_multi_indexes<index_seq, coeffs, as_tuple, dim_index>::type;
  59. };
  60.  
  61.  
  62. template <std::size_t ... Is>
  63. void print(std::index_sequence<Is...>)
  64. {
  65. const int dummy[] = {0, (std::cout << Is << " ", 0)...};
  66. (void) dummy;
  67. std::cout << std::endl;
  68. }
  69.  
  70. template <typename ...Ts>
  71. void print(const std::tuple<Ts...>&)
  72. {
  73. const int dummy[] = {0, (print(Ts{}), 0)...};
  74. (void) dummy;
  75. }
  76.  
  77. int main()
  78. {
  79. print(all_indexes<2, 4, 3>::type{});
  80. }
  81.  
Success #stdin #stdout 0s 3104KB
stdin
Standard input is empty
stdout
0 0 0 
0 0 1 
0 0 2 
0 1 0 
0 1 1 
0 1 2 
0 2 0 
0 2 1 
0 2 2 
0 3 0 
0 3 1 
0 3 2 
1 0 0 
1 0 1 
1 0 2 
1 1 0 
1 1 1 
1 1 2 
1 2 0 
1 2 1 
1 2 2 
1 3 0 
1 3 1 
1 3 2