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); }());