Lambda闭包vs简单的参数?

时间:2014-07-04 16:09:24

标签: c++

对于lambda表达式,我不太了解C ++ 11中闭包的用处。

auto f = [] (int n, int m) { return n + m };
std::cout << f(2,2);

int n = 2;
auto f = [n] (int m) { return n + m };
std::cout << f(2);

这是一个非常基本和原始的例子。我猜测闭包在其他类型的陈述中起着重要作用,但我的C ++书并没有澄清这一点(到目前为止)。

为什么不将闭包作为参数包括在内?

2 个答案:

答案 0 :(得分:4)

好的,一个简单的例子,从字符串中删除所有x

char x = 'x';
std::string s = "Text to remove all 'x's from";
s.erase(std::remove_if(s.begin(), s.end(), [x](char c) {return x == c;}), s.end());

http://en.cppreference.com/w/cpp/algorithm/remove

借款并修改

在此示例中,remove_if()只接受一个参数,但我需要两个值进行比较。

答案 1 :(得分:1)

并不总是立即调用闭包。当成功执行lambda函数所需的数据可能不再在范围内或可以从调用站点轻松访问时,它们是可以存储和调用的对象。

可以将所有必要的数据与封闭一起存储,但是它可以更加简单,以便在它创建时抓住任何需要的东西,并在它关闭时使用它。最终被称为。它提供了一种封装形式。

这也会减少代码耦合,因为如果您要将数据与代码一起存储,则调用者只能使用您决定存储的特定对象。由于闭包带有自己的数据,因此它可以处理所需的任何数据。

这是一个极其简单的现实生活中的例子。我构建了一个数据库服务器,需要支持具有多个值的字段。问题是,当显示结果时,重要的是突出显示哪些值实际上导致记录与搜索条件匹配。因此,查询解析器会以闭包的形式吐出一个谓词,表明它是否是匹配值。

它看起来像这样:

std::function< bool(int value) > parser::match_int(int search_val) {
    return [=](int value) { value == search_val; };
}

该闭包存储在一个集合中。当需要渲染记录时,我可以轻松确定需要突出显示哪些值。请记住,解析器和任何相关数据现在都已消失:

void render_values(std::function< bool(int value) > pred, std::vector<int> values) {
    for (int value : values) {
        if (pred(value))
            render_highlight(value);
        else
            render_normal(value);
    }
}