除了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語),簡直就無敵了。