// 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
    }
}