使用std::function
,我们可以使用argument_type
,second_argument_type
等typedefs得到一个参数的类型,但是我看不到用lambdas做同样事情的方法。可能吗? (我使用VS2010)我们可以得到一个lambda参数的类型吗?
说我想是在用于读取对象,并把它传递给setter函数我反序列化系统中的以下内容:
template<typename F>
static void forward(F f)
{
// Create an object of the type of the first
// parameter to the function object F
typedef typename F::argument_type T;
T t;
//...do something with 't' here (deserialize in my case)
// Forward the object to the function
f(t);
}
它可以像这样使用一切正常工作:
std::function<void(int)> f = [](int i) -> void { setValue(i); };
forward(f);
但它不会与lambda表达式直接合作:
forward([](int i) -> void { setValue(i); });
//error C2039: 'argument_type' : is not a
//member of '`anonymous-namespace'::<lambda1>'
有没有办法以lambda和std::function
对象的方式访问参数类型?也许一种方法可以首先获得lambda的std::function
类型,然后从argument_type
那里获得?
从下面的答案,与lambda表达式的作品和std::function
版本继是:
template<typename T, typename F>
static void forward(F f)
{
T t;
//...do something with 't' here (deserialize in my case)
f(t);
}
forward<int>([](int i) -> void { setValue(i); });
由于int
这里重复了,我希望能摆脱它 - 没有那么糟糕的int
但是在几个命名空间中对长命名类型更烦人。这就是生活!
简答:不。 – ildjarn
长答案:是的,见下文。 –