【Boost】boost库中function和bind一起使用的技巧(一)
1 bind/function 引
(1)頭文件
bind函數#include <boost/bind.hpp>
function使用頭文件#include <boost/function.hpp>
如果寫程序時出錯則在function及bind前面加上限定:"boost::"
?
(2)功能
bind綁定一個函數及其參數.
function是類和模板的組合,它定義的對象可以指向一個函數(包裝一個函數?),類似一個函數指針。既可以直接指向一個函數也可以接收bind的返回值。
?
(3)返回值
bind返回一個函數對象。
function本身是一種類模板,可被看作聲明的關鍵字。
?
2 用法
【bind】
一般用法:bind用于一般普通函數( 以非類、結構的成員函數 )具有多種形式,但用法簡單。
用于類、結構的成員函數:bind用于成員函數時必須要在參數列表中指出成員函數在所屬的類中的地址,成員函數所屬對象,讓bind知道此成員函數所屬類地址和調用此成員函數的類對象。除了這兩點額外的要求后,使用形式跟一般用法一致。
?
【function】
一般用法:function用于一般函數的情況下,只需要按照一般函數的 “返回值”,“參數列表( 參數列表用括號括起來,彼此用逗號隔開 )”來聲明對象,然后指向對應的函數地址(函數名)
用于成員函數:單用function來包裝類的成員函數,需要按照函數 “返回值”,“類指針類型和參數列表(類指針型別和餐宿列表在括號中,彼此用逗號隔開)”來聲明function對象。在調用被包裝的函數時,必須要事先定義一個類對象將其地址傳入,與聲明function對象時的第一個類指針參數相對應。讓function對象知道函數的所屬地址及具體調用成員函數類對象。
?
【bind & function】
不管是針對一般的函數還是針對類成員函數,都不可以使用占位符來作為bind的參數,因為用function調用包裝函數的時候會報參數不對應的錯誤。另外bind的返回一定要是一個函數地址而不是調用函數的形式。
在針對類成員函數的時候,function對象可以不再有類和對象的地址。因為bind已經將二者包裝了。
二者的其它用法跟其單獨使用時的規則大同小異。
?
2.1 bind
(1)bind 單用
void?print( int i, int j )
{
cout <<i <<"\t" <<j<<"\n";
}
?
[1]全參數綁定
bind(print, 3, 4)();
輸出3???????4
?
[2]部分參數綁定
bind( print, 3, _1)(4);//使用占位符給調用函數傳參占個位置:傳入4
輸出3???????4
?
[3]所有參數都不綁定
bind(print, _1, _2)(3, 4);
輸出3???????4
?
bind(print, * ,* );*表示參數,返回的是print函數,加在行尾加"()"表示調用print函數。?
?
(2)bind應用于成員函數
bind在用于成員函數時,除了函數地址的重要性之外,還要知道具體是哪一個對象在調用類中的成員函數。如果是在類中的成員函數中調用另外一個成員函數這個對象可以被聲明為this。
class Myfun
{
public:
??????? void print( int i, int j )
??????? {??
??????????????? cout << i<< "\t" << j << "\n";
?????? }
};
?
Myfun f;
boost::bind(&Myfun::print,f, 3, 4)();
?
要用bind綁定類類中的成員函數時,第一個參數表示成員函數的所在類的地址,第二個參數表示具體調用此成員函數的對象。后面的參數跟bind用于一般函數的用法一致。
?
2.2 function
(1)function應用于一般的函數
針對于一般設計的函數( 非類和結構體中的成員函數 )來說,function指向一個函數的使用形式為:
若函數定義的形式為:type fun_name( type1 i, type2? j){…}
則使用function指向此函數:function<type(type1 i, type2 j)> tf;
tf=fun_name;
調用函數:tf( 1, 2 );
function模板內"<>"所要使用的類型要和函數的一致:type表示所指函數的返回值類型,type1,type2是所指函數參數的類型。
?
void? print( int i, int j )
{
????? cout << i << "\t" << j <<"\n";
?}
?
boost::function<void(inti, int j)> tf;
tf =print;
tf(3, 4);
輸出3???????4
?(2)function應用于成員函數
要使用function指向一個類的成員函數時,不管是在指向此成員函數還是調用此成員函數都要讓function對象知道其地址(聲明function對象時就聲明了地址部分)。調用成員函數時還只能調用某一個對象的成員函數。
class Myfun
{
public:
??????? void print( int i, int j )
?????? {
?????????????? ?cout << i<< "\t" << j << "\n";
?????? }
};
?
boost::function<void(Myfun*,int i, int j)> tf;
tf =&Myfun::print;
Myfun f;
tf(&f::print,3, 4);
輸出3???????4
function應用直接應用于類的成員函數時,聲明時要聲明對應成員函數類的指針對象,在調用時再將定義的類對象的地址傳入。
?
2.3bind & function聯用
(1)普通函數(非成員函數)
對于普通函數,bind綁定函數全部參數或者全部參數缺省用占位符代替的情況都可以和function連用。不能在bind綁定函數時使用占位符來缺省部分參數,然后再和function連用,在bind內使用占位符時,如果在bind綁定函數后面補齊參數則與function對象的類型不匹配,如果在使用function對象時補齊參數,則編譯器會報函數參數不一致的錯誤。
?
(2)用于成員函數
class Myfun
{
public:
??????? void print( int i, int j )
??????? {
??????????????? cout << i<< "\t" << j << "\n";
??????? }
};
……...
?boost::function<void(int i, int j)> tf;
?Myfun f;
?tf = boost::bind(&Myfun::print, f, 3, 4);
tf(3, 4);
?
可編寫程序驗證二者聯用需要遵循的規則。就前面筆記。
?
?Note Over。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的【Boost】boost库中function和bind一起使用的技巧(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Boost】以boost::funct
- 下一篇: 【Boost】boost库中functi