在不知道函数参数的情况下使用 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::function
的 aliases 来调用 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
我怎样才能做到这一点?
一些精度:
- 我需要能够为
std::function
设置别名,以便在 traits
结构中定义它们并将它们传递到我的代码的多个部分
- return 类型将始终是
void
,只有参数可能会改变
简单地使用带有参数包的通用 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"; }; }
};
我想创建一个 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::function
的 aliases 来调用 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
我怎样才能做到这一点?
一些精度:
- 我需要能够为
std::function
设置别名,以便在traits
结构中定义它们并将它们传递到我的代码的多个部分 - return 类型将始终是
void
,只有参数可能会改变
简单地使用带有参数包的通用 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"; }; }
};