lambda表达式
一个lambda表达式表示一个可调用的代码单元,我们可以将其理解为一个未命名的内联函数。与任何函数相似,一个lambda具有一个返回类型、一个参数列表、一个函数体。但与函数不同,lambda可以定义在函数内部,一个lambda表达式具有如下形式:
[capture list捕获列表](parameter list参数列表) {函数体},例子如下:
auto f = [](const string &a,const string &b){return a.size() < b.size()}
从广义上说,lamdba表达式产生的是函数对象。在类中,可以重载函数调用运算符(),此时类的对象可以将具有类似函数的行为,我们称这些对象为函数对象(Function Object)或者仿函数(Functor)。
std::function
所以STL定义在<functional>头文件提供了一个多态的函数对象封装std::function,其类似于函数指针。它可以绑定任何类函数对象,只要参数与返回类型相同。如下面的返回一个bool且接收两个int的函数包装器:
std::function<bool(int, int)> wrapper = [](int x, int y) { return x < y; };
std::bind
bind是这样一种机制,它可以预先把指定可调用实体的某些参数绑定到已有的变量,产生一个新的可调用实体,这种机制在回调函数的使用过程中也颇为有用。
#include < functional>
int Func(int x, int y);
auto bf1 = std::bind(Func, 10, std::placeholders::_1);
bf1(20); ///< same as Func(10, 20)
class A
{
public:
int Func(int x, int y);
};
A a;
auto bf2 = std::bind(&A::Func, a, std::placeholders::_1, std::placeholders::_2);
bf2(10, 20); ///< same as a.Func(10, 20)
std::function< int(int)> bf3 = std::bind(&A::Func, a, std::placeholders::_1, 100);
bf3(10); ///< same as a.Func(10, 100)
参考资料:
https://www.cnblogs.com/yyxt/p/4253088.html
https://www.jianshu.com/p/d686ad9de817
https://www.cnblogs.com/HDK2016/p/11183341.html