1. lambda表达式
#include <iostream>
#include <string>
using namespace std;
//lambda表达式:表示一个可调用单元,理解为一个未命名的内联函数。
//[capture list] (parameter list) -> return type { function body }
void lambda_test()
{
//可以忽略参数列表和返回类型,但必须包含:捕获列表和函数体。
//如果忽略参数列表时,表示参数列表为空。
//如果忽略返回类型,lambda根据函数体中的代码推断出返回类型。
// 如果函数体只有一个return语句,则推断返回类型。否则返回类型为void
//
auto f = []{return 42; };
cout << f() << endl;
//lambda只有在捕获列表中捕获它所在函数中的局部变量,才能在函数体中使用该变量
//[&,list]引用捕获
//[=,list]值捕获。
int sz = 13;
int sx = 12;
auto func = [sz,sx](int a)/*->bool*/{
//if (sz > a){
// return true;
//}
//return false;
return sz + sx + a;
};
cout << func(31) << endl;
}
对于那种只在一两个地方使用的简单操作,lambda表达式是最有用的。
如果在很多地方使用相同的操作,通常应该定义一个函数,而不是多次编写相同的lambda表达式。
如果一个操作需要很多语句才能完成,通常使用函数更好。
举例:
可以用在简单的回调函数中。
如果lambda的捕获列表为空,通常可以用函数来代替它。
但是,对于捕获局部变量的lambda,就不该使用函数代替了。而是应该使用bind函数。
2. 标准库bind函数
接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。
#include <functional> //std::bind
bind VS lambda 使用示例:
#include <functional>
#include <iostream>
using std::cout;
using std::endl;
int add(int a, int b)
{
return a + b;
}
void std_bind_test()
{
int x = 13;
//int b = 5;
//cout << std::bind(add, x, 5)() << endl; //使用bind,使用局部变量,减少add函数需要的参数。
cout << std::bind(add, std::placeholders::_1,x)(5) << endl;
//使用bind,使用局部变量,减少add函数需要的参数。
//占位符在命名空间std::placeholders中。
cout << [x](int a){return x + a; }(3) << endl; //使用lambda,捕获局部变量
}
3. function类型
标准库function类型,定义在
#include <functional>
中
#include <functional>
#include <iostream>
using std::cout;
using std::endl;
int add(int a, int b)
{
return a + b;
}
int mul(int a, int b)
{
return a*b;
}
void std_bind_test()
{
function<int(int, int)> f; //定义一个函数对象。
f = add;
cout << f(3, 5) << endl;
f = mul;
cout << f(3, 5) << endl;
}