C++ has been stagnant for a long time, and while using many functional programming idioms with C++ was always possible, it was never easy. With each new version of the C++ standard, we have been getting better and better tools for writing functional and generic code. C++11 started by introducing lambdas, C++14 made lambdas much nicer to use, while C++17 went a few steps further by introducing algebraic data types like std::optional and std::variant. With C++20, the situation will become even better — ranges, concepts and coroutines will allow us to do even more. In this talk, we will explain how exactly these features fit into the FP style of programming.