將函數指標封裝成function object
在前面介紹了function object是STL演算法的主要使用方式。如果能將現有的函數指標,函數,成員函數等等都封裝成function object,就可以獲得STL演算法的支援,而且可以減少專門編寫function object的工作量。基本思路仍然是構造一個function object,內部能夠轉調函數指標。
bool foo(int x){ return x>=2;}typedef bool (*foo_pointer)(int x);template<typename pointer_type,typename arg_type,typename return_type>class pointer_bind{ public: explicit pointer_bind(pointer_type p):p_(p){ } return_type operator()(arg_type param){ return (*p_)(param); } private: pointer_type p_;};int main(int argc, char** argv) { foo_pointer p = foo; cout<<(*p)(3)<<endl; pointer_bind<foo_pointer,int,bool> binder(p); cout<<binder(4)<<endl; vector<int> v; v.push_back(1); v.push_back(2); vector<int>::iterator itor = std::find_if(v.begin(),v.end(),binder); cout<<*itor<<endl; return 0;}
上面的pointer_bind非常的初級,但是已經可以工作了。我可以用它構造一個function object,直接調用或者傳遞給find_if函數作為查詢條件。
boost::bind來封裝函數指標
寫到這裡,主角登場。boost提供了一系列bind函數,可以將函數指標,成員函數,函數對象,虛函數,函數引用都封裝在一個臨時function object內。並且能夠支援多達9個參數,同時還能智能的分析出傳回型別。
int main(int argc, char** argv) { foo_pointer p = foo; vector<int> v; v.push_back(1); v.push_back(2); vector<int>::iterator itor = std::find_if(v.begin(),v.end(),boost::bind(p,_1)); cout<<*itor<<endl; return 0;}
boost::bind(p,_1)詭異而簡單的寫法。_1是指第一個參數int x,不需要告知參數類型和傳回型別,boost::bind能夠自動推斷出來。boost::bind內容較多,後面會仔更分析。