【发布时间】:2011-12-18 02:46:25
【问题描述】:
给定一个 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对象(如上图)。
【问题讨论】:
-
如果你知道参数类型,那么this可以用来确定返回类型。我不知道如何弄清楚参数类型。
-
是否假定函数采用单个参数?
-
"参数类型" 但是任意 lambda 函数没有参数类型。它可以采用任意数量的参数。因此,任何特征类都必须设计为按位置索引查询参数。
-
@iammilind:是的。目前,我们可以假设。
-
@NicolBolas:暂时,我们可以假设 lambda 只接受一个参数。
标签: c++ lambda metaprogramming c++11 traits