lambda函数是否有签名,以便我可以传递它们?
template<class Fn>
HRESULT foreach(Fn _fuction)
{
}
object->foreach(
[param1, param2] (int item)
{
}
);
object->foreach(
[param1, param2, param3] (int item)
{
}
);
我想使用typedef函数而不是模板,我认为函数的类型将严格形式参数,但会允许捕获的列表变化。
我可以使用typedef代替模板来传递lambda函数吗?
类似的东西:
typedef void (*Fn)(int);
但允许lambda不是函数指针。
我尝试使用std :: fuction但似乎无法正常工作。
答案 0 :(得分:1)
lambda-expression 的类型(也是闭包对象的类型)是唯一,未命名为非 union类类型 - 称为闭包类型 ...
(C ++11§5.1.2/ 3,强调我的)
我对此的解读是,即使两个lambda表达式具有相同的参数列表,返回类型和捕获列表,它们仍然具有不同的类型。
auto f = []{};
typedef decltype(f) lambda_type;
void g(lambda_type lambda) { lambda(); }
int main() {
g(f); // OK
g([]{}); // error: type mismatch
}
所以不,你想要做的事情无法完成。正如其他人所建议的那样,尝试使用std::function
,或保留模板(模板有什么问题?)
答案 1 :(得分:0)
未指定lambda的实际类型。但它们可以转换为function
;在您的情况下,std::function<void(int)>
(void
是返回类型,参数类型放在括号中。)