C++11綁定器bind及function機制( 三 )

bind可以很輕松地做到,當然如果大家知道怎么使用bind1stbind2nd綁定類成員函數,也可以評論告知我,感謝~) 。
C++11 bind通用綁定器(函數適配器)我們可將bind函數看作是一個通用的函數適配器,它接受一個可調用函數對象,生成一個新的可調用函數對象來“適應”原對象的參數列表 。bind相比于bind1st和bind2nd,實現了“動態生成新的函數”的功能 。簡言之,可通過bind函數修改原函數并生成一個可以被調用的對象,類似于函數的重載,但是我們又不需要去重新寫一個函數,用bind函數就可以實現 。相信在上面講bind1st和bind2nd時 , 大家對這些關于綁定器(函數適配器)的概念已經有所認知 , 我們直接看看如何用的吧 。
綁定一個普通函數和函數指針
#include <iostream>#include <functional>using namespace std;using namespace placeholders;int fun(int a, int b, int c, int d, int e) {return a + b - c + d - e;}int main() {int x = 1, y = 2, z = 3;auto g = bind(fun, x, y, _2, z, _1); //第一個參數&可省略 但最好寫成&funcout << g(11, 22) << endl; // fun(1, 2, 22, 3, 11) => 1+2-22+3-11// cout << bind(fun, x, y, _2, z, _1)(11, 22) << endl; //等價}g是有兩個參數的二元函數對象,其兩個參數分別用占位符placeholders::_2placeholders::_1表示,_2代表二元函數對象的第二個參數22,_1代表二元函數對象的第一個參數11 。這個新的可調用對象將它自己的參數作為第三個和第五個傳遞給fun,fun函數的第一個、第二個第四個參數分別被綁定到給定的值x、y、z上 。

綁定一個類的靜態成員函數與綁定全局函數沒有任何區別,這里不做說明,可參考文章:[ bind綁定器使用方法 ],該文章中bind詳細用法中描述了對靜態成員方法的使用 。
綁定一個類成員函數
綁定器綁定一個成員函數時,我們知道非靜態成員函數第一個參數隱藏了一個this指針對象,所以綁定時綁定器第二個參數傳遞匿名類對象本身 。bind和之前的bind1stbind2nd一樣,最終返回的一定是函數對象,下面的代碼將一個五元函數綁定后,返回了一個三元函數對象 , 效果等同于調用f.operator()(10, 6, 7) 。
#include <iostream>#include <functional>using namespace std;using namespace placeholders;class Test {public:int func(int a, int b, int c, int d, int e) { return a + b - c + d - e; }};int main() {auto f = bind(&Test::func, Test(), _1, 12, _3, 5, _2);cout << f(10, 6, 7) << endl; //輸出:10+12-7+5-6 = 14cout << f.operator()(10, 6, 7) << endl;}作為類成員函數,需要注意的一點是,如果是非靜態的成員函數 , 它會存在一個默認的this指針,靜態的成員函數則不存在this指針,所以在將其作為bind函數的參數時,需要注意使用this指針作為其中一個參數 , 當使用靜態成員函數作為參數時,其用法和全局函數類似,當參數為類內非靜態成員函數時,第一個參數必須使用&符號 。
注:成為成員函數時,第一個參數之所以必須使用&符號,這部分原因可參考:[ C++中普通函數指針與類成員函數指針的異同 ],文章中有說明具體原因 。
以上就是C++11 bind的使用方法,衍生于bind1stbind2nd,支持更多的參數綁定,關于bind函數更多的使用方法,也可參考C++Boost的說明文檔:[ Boost.Bind ] 。關于bind函數綁定的過程,可參考:[ bind原理圖釋 ],該文章中的圖片方便我們對綁定過程的理解 。
C++11 function機制C++11的function機制是C語言中函數指針的衍生,用來實現回調功能 , 我們上面的綁定器通常都是以語句執行為單位,當出了某個語句的執行后,綁定器返回的這個函數對象也就隨之消失,因此需要有回調功能的function去長期保留綁定器返回的函數對象,以便在需要的時候隨時通過function機制調用即可 。那有人會問,既然有函數指針,為什么還要再整出來一個function機制?這不是多此一舉嗎?答案肯定是:很有必要,因為function能做到的,函數指針未必能做到 , 接下來容我花點篇幅去說明為什么C++中有函數指針還需要std::function

推薦閱讀