通过引用接收 lambda 作为参数的正确方法

新手上路,请多包涵

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

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

或者

void f(auto& lambda);

我不确定最后一种形式是否合法。

还有其他方法来定义 lambda 参数吗?

原文由 lurscher 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 955
2 个回答

您不能有 auto 参数。你基本上有两个选择:

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

选项 #2:使用模板参数:

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

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

不要忘记在引用 std::forward<F&&>(lambda) 时使用 --- lambda ,因为它是一个 r 值引用。

原文由 bdonlan 发布,翻译遵循 CC BY-SA 4.0 许可协议

从 C++ 20 开始,

 void f(auto& lambda);

实际工作(它是一个 缩写的函数模板):

当占位符类型( autoConcept auto )出现在函数声明或函数模板声明的参数列表中时,该声明声明了一个函数模板,并且一个发明的模板参数用于每个占位符都附加到模板参数列表中

它完全等同于@bdonlan’s answer中的选项2:

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

原文由 Alexey Romanov 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题