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

标签 c++ lambda c++11 function-prototypes function-parameter

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

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

void f(auto& lambda);

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

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

最佳答案

您不能拥有 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 值引用。

关于c++ - 通过引用接收 lambda 作为参数的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6458612/

相关文章:

c++ - 如何确定 'sequenced before'其他人是什么?

c++ - 多重定义错误 : How to declare a reference in a header file?

c++ - 创建一个动态二维数组来存储类对象

function - Kotlin:高阶函数,如何将函数添加到集合中并调用它们

c++ - 如何仅使用 Element 成员函数和 STL 来累积容器中 Element 成员函数的结果?

c++ - std::thread() 和 std::ref() 在类内部使用时导致构建错误

c++ - 为什么大多数最大的开源项目都是 C 语言?

c++ - 与 move 构造函数混淆 : unable to call move constructor

c# - 表达式 lambda 和语句 lambda 的区别

c++ - 你有在圆上应用函数的技巧吗?