【发布时间】:2017-11-19 14:40:12
【问题描述】:
使用std::function,我们可以使用argument_type、second_argument_type 等类型定义来获取参数的类型,但我看不到用lambdas 做同样事情的方法。可能吗? (我用的是VS2010)
假设我想要在我的反序列化系统中使用类似以下的内容来读取对象并将其传递给 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>'
有没有一种方法可以同时适用于 lambdas 和 std::function 对象来访问参数类型?也许是一种首先获取 lambda 的 std::function 类型,然后从中获取 argument_type 的方法?
根据下面的答案,适用于 lambdas 和 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 来说还不错,但对于几个命名空间中的长名称类型来说更烦人。生活吧!
【问题讨论】:
标签: c++ visual-studio-2010 lambda c++11