C++ 筆記 std::function bind 和 lambda表達式

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

https://blog.csdn.net/vict_wang/article/details/88555246

https://www.cnblogs.com/jimodetiantang/p/9016826.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章