// compile with c++ --std=c++17 ./c++17.cpp #include #include #include #include #include template using il = std::initializer_list; auto reduce = [](const auto& reducer, const auto& collection, auto&& init) -> auto { for (auto& e : collection) { reducer(init, e); } return init; }; auto slice = [](auto&& input, int beg, int end) -> decltype(auto) { using T = typename std::remove_reference::type; const auto size = input.size(); if (beg > size || end > size || beg < 0 || end < 0) { throw std::out_of_range("beg/end must be between [0, input.size())"); } if (beg > end) { throw std::invalid_argument("beg must be less than end"); } return T(input.begin() + beg, input.begin() + end); }; int fibonacci(int value) { auto [ a, b ] = std::tuple{ 1, 1 }; for (int i = 0; i < value; i++) { std::tie(a, b) = std::tuple{ b, a+b }; } return b; }; int main() { std::cout << "fib 5 is: " << fibonacci(5) << std::endl; std::cout << "sum is: " << reduce( [](auto& acc, const auto& cv){ acc *= cv; }, il{2,2,2,2,2}, 1 ) << std::endl; auto v = std::vector { 1,2,3,4,5 }; std::cout << "slice: "; for (auto e : slice(v, 1, 4)) { std::cout << e << " "; } std::cout << std::endl; }