将lambda函数传递给其他方法

时间:2014-06-13 17:03:43

标签: c++ lambda

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但似乎无法正常工作。

2 个答案:

答案 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是返回类型,参数类型放在括号中。)