std::tr1::bind和std::tr1::function的用法


除了std::tr1::bind,另外有一個boost::bind,這個應該與boost中其他的數據結構結合的很緊。后者好像用的更多。(boost::function和boost::bind已經納入了std::tr1,所以這兩者應該是一樣的

bind使用形式

bind(&f)()  假設f是一個全局函數,綁定全局函數並調用

bind (&A::f, A())()  假設A是一個構造函數為空的類,這個形式綁定了類的成員函數,故第二個參數需要傳入一個成員。(成員靜態函數除外)

bind (&A::f, _1)(new A()) 同上,效果是一樣的,但是使用了占位符,使得沒有固定的的對象,推薦

 

綁定帶返回值的簡單使用例子

#include <stdio.h>
#include <tr1/functional>

using std::tr1::function;
using std::tr1::bind;

int func(int x,int y) {
    printf("nimei x:%d y:%d\n", x, y);
    return 3;
}
int main() {
    printf("%d\n", bind<int>(&func, 3, 4)());
    return 0;
}

使用的時候一定要注意指向的是沒有this指針的函數(全局函數或靜態成員函數),還是有this指針的函數。后面一種必須要用bind()函數。而且要多一個參數

bind(F f, T1 t1, T2 t2, ..., TN tN);

具體為:

bind(&要調用的函數,&對象, 要調用函數的參數1,要調用函數的參數2...,_1(bind函數的參數1),_2(bind函數的參數2)...)


如果bind的是一個非靜態成員函數,第二個參數一定是一個該成員的一個指針,后面才是正常的參數。

bind中,如果有占位符,那么bind返回的就是相應的參數的函數。比如_1 代表的是int型的參數,那么bind返回的就是void (int),假設綁定的時候返回值為void

如果在一個pool中使用bind,那么相應的函數實現可以在其他地方實現而不在pool類中實現,而在其他類中實現,這樣可以保持pool的簡潔性。
 

注:

1.typedef function<void(FrameworkPtr)> FrameworkFunc  這個定義代表FrameworkFunc是一個有一個FrameworkPtr為參數,無返回的函數。

2.“繼承就像一條賊船,上去就下不來了”,而借助boost::function和boost::bind,大多數情況下,你都不用上賊船。

3 如果沒有boost::bind,那么boost::function就什么都不是,而有了bind(),“同一個類的不同對象可以delegate給不同的實現,從而實現不同的行為”(myan語),簡直就無敵了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM