通过引用接收 lambda 作为参数的正确方法
定义通过引用接收 int->int
lambda 参数的函数的正确方法是什么?
void f(std::function< int(int) >& lambda);
或者
void f(auto& lambda);
我不确定最后一种形式是否合法。
还有其他方法来定义 lambda 参数吗?
What is the right way to define a function that receives a int->int
lambda parameter by reference?
void f(std::function< int(int) >& lambda);
or
void f(auto& lambda);
I'm not sure the last form is even legal syntax.
Are there other ways to define a lambda parameter?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您不能有
auto
参数。您基本上有两个选择:选项#1:使用
std::function
如您所示。选项#2:使用模板参数:
在某些情况下,选项#2 可能更高效,因为它可以避免嵌入 lambda 函数对象的潜在堆分配,但只有在
f
时才可能可以作为模板函数放置在标头中。与任何模板一样,它还可能会增加编译时间和 I-cache 占用空间。请注意,它也可能没有任何效果,就好像 lambda 函数对象足够小一样,它可以在std::function
对象中内联表示。引用
lambda
时,不要忘记使用std::forward(lambda)
,因为它是右值引用。You cannot have an
auto
parameter. You basically have two options:Option #1: Use
std::function
as you have shown.Option #2: Use a template parameter:
Option #2 may, in some cases, be more efficient, as it can avoid a potential heap allocation for the embedded lambda function object, but is only possible if
f
can be placed in a header as a template function. It may also increase compile times and I-cache footprint, as can any template. Note that it may have no effect as well, as if the lambda function object is small enough it may be represented inline in thestd::function
object.Don't forget to use
std::forward<F&&>(lambda)
when referring tolambda
, as it is an r-value reference.我将使用
template
作为:输出:
演示:http://www.ideone.com/埃伊Vq
I would use
template
as:Output:
Demo : http://www.ideone.com/EayVq
我知道已经过去 7 年了,但这里有一种其他人没有提到的方法:
哪些输出:
不需要模板或 std::function
I know it's been 7 years, but here's a way nobody else mentioned:
Which outputs:
No need for templates or std::function
从 C++ 20 开始,
实际上可以工作(它是一个缩写函数模板):
,它相当于 @bdonlan 答案中的选项 2:
Since C++ 20,
actually works (it's an abbreviated function template):
and it's equivalent to exactly option 2 in @bdonlan's answer:
很接近了。实际编译的内容是:
That's close. What will actually compile is: