在不知道函数参数的情况下使用 lambda 创建 std::function

Creating a std::function with a lambda without knowing the arguments of the function

我想创建一个 std::function from a lambda, in a template,它将所需的 std::function 实例作为其参数:

template <class functionT>
functionT make_lambda() {
    return [](/* ignore all args */){ std::cout << "my lambda\n"; };
}

然后用 std::functionaliases 来调用 template :

using function_no_args = std::function<void(void)>;
using function_args = std::function<void(int)>;

make_lambda<function_no_args>()(); // output: "my lambda"
make_lambda<function_args>()(999); // compile error

我怎样才能做到这一点?

一些精度:

简单地使用带有参数包的通用 lambda 来吞下并忽略可能给它的任何参数:

template <class functionT>
functionT make_lambda() {
    return [](auto&&...){ std::cout << "my lambda\n"; };
}

如果你能接受不同的调用方式

make_lambda<function_no_args>::func()();
make_lambda<function_args>::func()(999);

您可以使用模板专业化make_lambda使函数成为函数

template <typename>
struct make_lambda;

template <typename ... Args>
struct make_lambda<std::function<void(Args...)>>
 {
   static std::function<void(Args...)> func ()
    { return [](Args ...){ std::cout << "my lambda\n"; }; }
 };