Advertisement
Guest User

Untitled

a guest
Jul 27th, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.95 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cstddef>
  3. #include <cstring>
  4. #include <cwctype>
  5. #include <functional>
  6. #include <iostream>
  7. #include <string>
  8. #include <tuple>
  9. #include <utility>
  10.  
  11. using namespace std;
  12.  
  13. #ifdef _MSC_VER
  14. #pragma warning(disable: 4555)
  15. #endif
  16.  
  17. namespace detail
  18. {
  19. template <size_t N, size_t Max>
  20. struct fold
  21. {
  22. template <typename T, typename Z, typename F>
  23. static decltype(auto) apply(T&& t, Z&& z, F f)
  24. {
  25. return fold<N+1, Max>::template apply(
  26. std::forward<T>(t),
  27. f(std::forward<Z>(z), get<N>(std::forward<T>(t))),
  28. f);
  29. }
  30. };
  31.  
  32. template <size_t Max>
  33. struct fold<Max, Max>
  34. {
  35. template <typename T, typename Z, typename F>
  36. static decltype(auto) apply(T, Z& z, F)
  37. {
  38. return z;
  39. }
  40. template <typename T, typename Z, typename F>
  41. static auto apply(T, const Z& z, F)
  42. {
  43. return z;
  44. }
  45. };
  46. }
  47.  
  48. template <typename F, typename Z, typename... Ts>
  49. decltype(auto) fold(const tuple<Ts...>& t, Z&& z, F&& f)
  50. {
  51. return detail::fold<0, sizeof...(Ts)>::template apply(
  52. t, std::forward<Z>(z), std::forward<F>(f));
  53. }
  54.  
  55. template <typename F, typename Z, typename... Ts>
  56. decltype(auto) fold(tuple<Ts...>&& t, Z&& z, F&& f)
  57. {
  58. return detail::fold<0, sizeof...(Ts)>::template apply(
  59. std::move(t), std::forward<Z>(z), std::forward<F>(f));
  60. }
  61.  
  62. size_t string_len(const string& s) { return s.size(); }
  63. size_t string_len(const char* s) { return strlen(s); }
  64. size_t string_len(bool) { return 1; }
  65. size_t string_len(char) { return 1; }
  66. template <typename T>
  67. size_t string_len(T t) { return to_string(t).size(); }
  68.  
  69. int main()
  70. {
  71. auto t = make_tuple("Hello", 3.14, 1729, 'a');
  72.  
  73. {
  74. auto f = [] (ostream& s, const auto& x) -> ostream& {
  75. return s << x << '\n';
  76. };
  77. decltype(auto) s = fold(t, cout, f);
  78. s << "done" << endl;
  79. }
  80.  
  81. {
  82. auto f = [] (size_t l, const auto& x) {
  83. return l + string_len(x);
  84. };
  85. decltype(auto) s = fold(t, size_t{}, f);
  86. cout << s << endl;
  87. }
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement