C++中的boost::function庫簡介
boost::function Boost.Function庫用來提供一個對象化的函數指針,通過它可以很容易的將一個函數封裝為仿函數。
boost::function庫可以支持自由函數,函數對象,類成員函數。而且參數個數多達10個。boost::function庫利用模板技術來實現。生成的代碼有很高的運行效率。首先我們還是以一個例子簡單的說明它的用法:
#include <iostream>
#include <boost/function.hpp>
using namespace std;
float add(int x,float y)
{
return x + y;
}
int main()
{
boost::function<float (int x, float y)> f = &add;
cout<<"add(3,2) is "<<f(3,2)<<endl;
}在上面的例子中,
定義了一個仿函數,它指向add函數。這個是一種比較容易理解的方式,也是boost推薦的寫法,但有的編譯器不支持(其實大多數主流編譯器都支持)這種模板的語法,不支持的編譯器包括:
Microsoft Visual C++ 6.0, 7.0
Borland C++ 5.5.1
Sun WorkShop 6 update 2 C++ 5.3
Metrowerks CodeWarrior 8.1
如果你用了上述編譯器,則應使用boost::function2<float, int, float> f;的形式。
如果只是封裝普通函數(功能類似函數指針),則使用方式和普通函數指針類似,可以直接通過"="來進行函數的封裝,通過"()"來實現函數的調用。
如果用它來封裝成員函數(用函數指針來指向成員函數用起來可不是一般的惡心),可以通過如下兩種方式:
通過boost::bind庫實現。
通過stl庫std::bind1st和std::mem_fun 函數組合實現。
下面是一個簡單的示例:
struct X
{
bool foo(int a){ cout<<a<<endl; return false;}
};
int main()
{
boost::function<bool (int)> f;
X x;
f = std::bind1st(
std::mem_fun(&X::foo), &x);
f(5);
f = boost::bind(&X::foo, &x, _1);
f(5);
}boost::function對象還有一些成員函數,如contains、clear、empty等,也是一些比較有用的函數,功能很簡單,這里就不多介紹了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

