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