介绍与引入
最近在阅读C++ Concurrency in Action 2rd edition 以学习C++的多线程特性,发现许多地方都使用了Lambda函数,因此就附录里的内容做一些笔记。
Lambda函数是C++11标准中新增的一个特性,允许在需要使用的时候才进行定义,这种语法糖的特性大大简化了代码复杂度,在某些时候特别有用。其语义可以用来快速地表示可访问的变量,而非使用类中函数来对成员变量进行捕获。
基本的Lambda表达式
Lambda表达式最简单的形式,便是一个self-contained函数,其没有输入参数,仅仅依赖全局变量与函数,甚至可以没有返回值。这样的lambda表达式是一系列由大括号包裹的语句,并且以一对方括号[]
作为前缀(称为lambda introducer)。
[]{ // Lambda表达式以[]开始
do_stuff();
do_more_stuff();
}(); // 表达式结束,可以直接调用
在这个例子中,表达式通过后面的()
调用,不过这种方式不常见。如果你要直接调用,直接写就是了,不必再通过lambda表达式。更加常见的用法是将lambda表达式作为一个函数模版的参数,该参数是一个可调用的对象,这种情况下的lambda表达式就可能需要传参或是返回值。如果需要给lambda函数传递参数,在lambda introducer后附上参数列表即可。
以下是一个具体的例子,通过lambda函数对vector中的元素依次打印输出
std::vector<int> data=make_data();
std::for_each(data.begin(),data.end(),[](int i){std::cout<<i<<"\n";});
返回值也很简单,如果lambda函数的函数体只包含一个return
语句,那么返回值的类型就是lambda函数的返回值类型 。例如,使用lambda函数来等待std::condition_variable
中的flag被设置(这里都用多线程的例子,等待函数未来会填坑(也许))