c ++ 0x:通过引用接收lambda作为参数的正确方法

什么是正确的方法来定义一个函数,通过引用接收int->int lambda参数?

 void f(std::function< int(int) >& lambda); 

要么

 void f(auto& lambda); 

我不确定最后一种forms甚至是合法的语法。

是否有其他方法来定义一个lambda参数?

你不能有一个auto参数。 你基本上有两个select:

选项#1:使用std::function如你所示。

选项2:使用模板参数:

 template<typename F> void f(F &lambda) { /* ... */} 

在某些情况下,选项2可能更高效,因为它可以避免为embedded的lambda函数对象分配潜在的堆,但是只有当f可以作为模板函数放在头中时才有可能。 它也可以像任何模板一样增加编译时间和I-cache占用空间。 请注意,它也可能没有效果,就好像lambda函数对象足够小,它可以在std::function对象中内联表示。

我将使用template

 template<typename Functor> void f(Functor functor) { cout << functor(10) << endl; } int g(int x) { return x * x; } int main() { auto lambda = [] (int x) { cout << x * 50 << endl; return x * 100; }; f(lambda); //pass lambda f(g); //pass function } 

输出:

 500 1000 100 

演示: http : //www.ideone.com/EayVq

我知道这个问题已经被回答了,但是当我正在寻找这个问题的答案时,我正在寻找一些与这里的答案有所不同的东西,我想这可能是OP所指的,所以这里是希望这会帮助别人。

假设你有一个function:

 void print(int n) { printf("%i ", n); } 

为了传递一个lambda到这个函数,你需要做以下的事情:

 print([]{ return 3; }()); 

这显然会传递给函数3。 一个更有用的例子,特别是与OP的问题相关的是一个lambda,它将一个整数作为参数,并返回一个int给结束函数:

 int x = 3; auto lambdaFunction = [](int input) { return (input + 1); }; print(lambdaFunction(x)); 

这是假设你不通过价值或通过引用的lambda,你可以直接做:

 // Pass by value print([=]{ return (x + 1); }()); // Pass by reference print([&]{ return (x + 1); }());