language: C++11 (gcc-4.7.2)
date: 555 days 14 hours ago
link:
visibility: public
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <functional>
#include <iostream>
#include <type_traits>
#include <utility>
 
template <typename F, typename T> T foldr1(F&& f, T&& x) { return std::forward<T>(x); }
 
template <typename F, typename T, typename ...Args>
typename std::common_type<T, Args...>::type foldr1(F&& f, T&& x, Args&&... args)
{
  return f(std::forward<T>(x), foldr1(std::forward<F>(f), std::forward<Args>(args)...));
}
 
template <typename F, typename T> T foldl1(F&& f, T&& x) { return std::forward<T>(x); }
template <typename F, typename T, typename U>
typename std::common_type<T,U>::type foldl1(F&& f, T&& x, U&& y) {
  return f(std::forward<T>(x), std::forward<U>(y));
}
 
template <typename F, typename T, typename ...Args>
typename std::common_type<T, Args...>::type foldl1(F&& f, T&& x, T&& y, Args&&... args)
{
  return foldl1(std::forward<F>(f), f(std::forward<T>(x), std::forward<T>(y)), std::forward<Args>(args)...);
}
 
int main()
{
  std::cout << "(1 - (2 - (3 - 4))) = " << foldr1(std::minus<int>(), 1, 2, 3, 4) << '\n';
  std::cout << "(((1 - 2) - 3) - 4) = " << foldl1(std::minus<int>(), 1, 2, 3, 4) << '\n';
}