对于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 ++书并没有澄清这一点(到目前为止)。
为什么不将闭包作为参数包括在内?
答案 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);
}
}