给定一个 lambda,是否有可能找出它的参数类型和返回类型?如果是,如何?
基本上,我想要 lambda_traits
可以通过以下方式使用:
auto lambda = [](int i) { return long(i*10); };
lambda_traits<decltype(lambda)>::param_type i; //i should be int
lambda_traits<decltype(lambda)>::return_type l; //l should be long
背后的动机是我想在接受 lambda 作为参数的函数模板中使用 lambda_traits
,我需要知道它的参数类型和函数内部的返回类型:
template<typename TLambda>
void f(TLambda lambda)
{
typedef typename lambda_traits<TLambda>::param_type P;
typedef typename lambda_traits<TLambda>::return_type R;
std::function<R(P)> fun = lambda; //I want to do this!
//...
}
目前,我们可以假设 lambda 只接受一个参数。
最初,我尝试使用 std::function
作为:
template<typename T>
A<T> f(std::function<bool(T)> fun)
{
return A<T>(fun);
}
f([](int){return true;}); //error
但这显然会出错。于是我改成了 TLambda
版本的函数模板,想在函数内部构造 std::function
对象(如上图)。
原文由 Nawaz 发布,翻译遵循 CC BY-SA 4.0 许可协议
有趣的是,我刚刚写了一个
function_traits
实现,它基于 Specializing a template on a lambda in C++0x 可以提供参数类型。如该问题的答案所述,诀窍是使用decltype
的operator()
。请注意,此解决方案 不适 用于像
[](auto x) {}
这样的通用 lambda。