fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <functional>
  4.  
  5. #define Return(Ret) decltype Ret { return Ret; }
  6.  
  7. template <int NUM_LEFT, int SHIFT>
  8. class rotate_tuple_helper {
  9. private:
  10. static constexpr int positiveModulo (int i, int n) {return (i % n + n) % n;}
  11. template <typename TUPLE>
  12. static constexpr int shift() {return positiveModulo (SHIFT, std::tuple_size<TUPLE>::value);}
  13. public:
  14. template <typename TUPLE>
  15. constexpr auto operator() (const TUPLE& t) const
  16. -> Return((std::tuple_cat (std::make_tuple (std::get<shift<TUPLE>()>(t)), rotate_tuple_helper<NUM_LEFT-1, SHIFT+1>()(t))))
  17. };
  18.  
  19. template <int SHIFT>
  20. class rotate_tuple_helper<0, SHIFT> {
  21. public:
  22. template <typename TUPLE>
  23. constexpr std::tuple<> operator() (const TUPLE& ) const {return std::tuple<>();}
  24. };
  25.  
  26. template <int SHIFT>
  27. struct rotate_tuple {
  28. template <typename TUPLE>
  29. constexpr auto operator() (const TUPLE& t) const -> Return ((rotate_tuple_helper<std::tuple_size<TUPLE>::value, SHIFT>()(t)))
  30. };
  31.  
  32. template <std::size_t N, typename Functor> struct self_composeN
  33. {
  34. template <typename T>
  35. constexpr auto operator () (T t) const -> Return((self_composeN<N - 1, Functor>()(Functor()(t))))
  36. };
  37.  
  38. template <typename Functor> struct self_composeN<0u, Functor>
  39. {
  40. template <typename T>
  41. constexpr T operator () (T t) const { return t; }
  42. };
  43.  
  44.  
  45. #if 1 // Not in C++11 // make_index_sequence
  46. #include <cstdint>
  47.  
  48. template <std::size_t...> struct index_sequence {};
  49.  
  50. template <std::size_t N, std::size_t... Is>
  51. struct make_index_sequence : make_index_sequence<N - 1, N - 1, Is...> {};
  52.  
  53. template <std::size_t... Is>
  54. struct make_index_sequence<0u, Is...> : index_sequence<Is...> {};
  55.  
  56. #endif // make_index_sequence
  57.  
  58. namespace detail {
  59. template<typename Tuple, std::size_t... Is>
  60. void print_tuple(std::ostream& os, Tuple const& t, index_sequence<Is...>){
  61.  
  62. int dummy[] = {0, (void(os << (Is == 0? "" : ", ") << std::get<Is>(t)), 0)...};
  63. static_cast<void>(dummy);
  64. }
  65.  
  66. }
  67.  
  68. template <typename ...Ts>
  69. std::ostream& operator << (std::ostream& os, const std::tuple<Ts...>& t)
  70. {
  71. os << "{";
  72. detail::print_tuple(os, t, make_index_sequence<sizeof...(Ts)>());
  73. return os << "}";
  74. }
  75.  
  76. template <typename Tuple>
  77. void print(const std::string& name, const Tuple&t)
  78. {
  79. std::cout << name << " = " << t << std::endl;
  80. }
  81.  
  82. int main() {
  83. using tuple_type = std::tuple<int, std::string, double, char, std::string, int, double, char>;
  84. const tuple_type t (8, "house", 3.14, 'b', "apple", 6, 1.5, '!');
  85.  
  86. print("rot0", rotate_tuple<0>()(t));
  87. print("rot1", rotate_tuple<1>()(t));
  88. print("rot2", rotate_tuple<2>()(t));
  89. print("rot3", rotate_tuple<3>()(t));
  90.  
  91. print("self0", self_composeN<0u, rotate_tuple<1>>()(t));
  92. print("self1", self_composeN<1u, rotate_tuple<1>>()(t));
  93. print("self2", self_composeN<2u, rotate_tuple<1>>()(t));
  94. print("self3", self_composeN<3u, rotate_tuple<1>>()(t));
  95.  
  96. return 0;
  97. }
  98.  
Success #stdin #stdout 0s 3436KB
stdin
Standard input is empty
stdout
rot0 = {8, house, 3.14, b, apple, 6, 1.5, !}
rot1 = {house, 3.14, b, apple, 6, 1.5, !, 8}
rot2 = {3.14, b, apple, 6, 1.5, !, 8, house}
rot3 = {b, apple, 6, 1.5, !, 8, house, 3.14}
self0 = {8, house, 3.14, b, apple, 6, 1.5, !}
self1 = {house, 3.14, b, apple, 6, 1.5, !, 8}
self2 = {3.14, b, apple, 6, 1.5, !, 8, house}
self3 = {b, apple, 6, 1.5, !, 8, house, 3.14}