// g++ -std=c++17 -Wall -Wextra -Wpedantic -o lambda_merge_ctad lambda_merge_ctad.cpp // Merge lambdas using inheritance and Class Template Argument Deduction // (CTAD). #include <iostream> #include <utility> template<typename... B> struct Merged : B... { // template<typename... T> // Merged(T &&... t) : B(std::forward<T>(t))... {} using B::operator()...; }; // Not needed in C++20. template<typename... T> Merged(T...) -> Merged<std::decay_t<T>...>; int main() { // { // auto l1 = []() { return 42; }; // auto l2 = [](int i) { return 10 * i; }; // auto merged = Merged(l1, l2); // std::cout << merged() << '\n'; // 42 // std::cout << merged(2) << '\n'; // 20 // } { auto merged = Merged{ []() { return 42; }, [](int i) { return 10 * i; }, }; std::cout << merged() << '\n'; // 42 std::cout << merged(2) << '\n'; // 20 } }