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
|
#include <iostream>
#include <utility>
#include <stddef.h>
template <typename Fn, typename In, typename Out>
constexpr Out fold(Fn function, In *input, size_t length, Out initial)
{
for (size_t i = 0; i < length; ++i)
initial = function(std::move(initial), input[i]);
return initial;
}
int main()
{
constexpr int len = 5;
int data[len] = {100, 200, 300, 400, 500};
auto bsum = [](auto x, auto y) { return x + y; };
auto bmax = [](auto x, auto y) { return x > y? x: y; };
auto bmin = [](auto x, auto y) { return x < y? x: y; };
auto n_over_200 = [](auto x, auto y) { return y > 200? 1 + x: x; };
std::cout << "sum: " << fold(bsum, data, len, 0) << '\n'
<< "max: " << fold(bmax, data, len, data[0]) << '\n'
<< "min: " << fold(bmin, data, len, data[0]) << '\n'
<< "> 200: " << fold(n_over_200, data, len, 0) << '\n';
}
|