【问题标题】:How to send lambda function as parameter to another function如何将 lambda 函数作为参数发送到另一个函数
【发布时间】:2020-06-12 10:55:54
【问题描述】:

如果我有 lambda 作为表达式,如何编写“查找”函数定义:

    int main() {
        vector<Student> v = { Student("Pero", "Peric", "3882"),
            Student("Ivo", "Ivic", "10991"),
            Student("Mara", "Maric", "40911"),
            Student("Ivan", "Juric", "93877"),
            Student("Ivo", "Kalic", "20991")
        };
vector<Student*> r = find(v, [](Student* s) { return s->name() == "Ivo"; });

【问题讨论】:

  • 这能回答你的问题吗? How to declare a function that accepts a lambda?
  • 惯用的方式是使用模板函数。类似template &lt;typename F&gt; auto find(const std::vector&lt;Student&gt;&amp; vec, F find) { ... }
  • 显示完整代码,但首先请尝试搜索。
  • 不相关,但我会称之为 find_all_if 之类的,find 有点暗示它会得到一个元素而不是所有元素(至少标准库 find 是这样做的)
  • 如果findstd::find_if 你应该把Student* s 改成const Student&amp; s

标签: c++


【解决方案1】:

接受您输入的查找函数的原型:

vector<Student*> find(vector<Student> & v, std::function<bool(Student*)> lambdaFct)

显然,除非你的 find 调用 std::find。你的问题不是很清楚。

在下一条评论后编辑: 或者模板方式:

template<typename Func>
vector<Student*> find(vector<Student> & v, Func f)

【讨论】:

  • 如果 OP 不需要增加使用 std::function 的开销是没有意义的,即如果他们可以编写模板代码来做同样的事情而无需昂贵的类型擦除。并不是说它在实践中可能很重要,在这种情况下......但是人们应该先写最简单的东西,然后只有在有具体证据表明需要时才将其复杂化。
  • ...并且向量应该作为const参考传递
  • 如果返回向量包含指向非常量学生的指针,则该向量必须是非常量
  • @Mestkon 谢谢,是的,这就是我将输入向量设为无常量的原因。
  • 并且Func 应该由通用引用传递,以防它包含复制成本高昂的数据。 template&lt;typename Func&gt; vector&lt;Student*&gt; find(vector&lt;Student&gt; &amp; v, Func&amp;&amp; f)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多