Boost库之function的使用
生活随笔
收集整理的這篇文章主要介紹了
Boost库之function的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://www.cnblogs.com/hujian/archive/2009/06/04/1495813.html
Boost庫的function是一組函數對象包裝類的模板,實現了一個泛型的回調機制。Boost庫的function與函數指針相比,優點在于它允許用戶在目標的實現上擁有更大的彈性,即目標既可以是普通函數(自由函數),也可以是函數對象和類成員函數,而且可以給函數添加狀態。
使用Boost庫的function,可以很好地與現有的代碼融合在一起。另外,function還可以與Boost庫的bind和lambda配合使用,從而極大地擴展了function的適用范圍。function庫支持的函數參數個數最多為10個,其頭文件為function.hpp或functionX.hpp(其中,X為0到10之間的整數)。如果你的程序中只使用了X個參數的function,那么你可以只包含對應的functionX.hpp,當然,你也可以只包含function.hpp(它包含了所有的functionX.hpp)。下面介紹function庫的具體用法。
◆?? ?普通函數(自由函數)用法
int Add(int x, int y)
{
?? ??? ??? ?return x+y;
}
?? ??? ?function<int (int,int)> f;?? ??? ??? ?// 或者? function2<int, int, int> f;
?? ??? ?f = Add;
?? ??? ?cout << "f(2, 3)=" << f(2, 3) << endl;
?? ??? ?其中,模板參數的第1個int為返回值類型,后兩個int為參數類型。
◆?? ?函數對象用法
class CStudent
{
public:
?? ??? ??? ?void operator() (string strName, int nAge)
?? ??? ??? ?{
?????? ??? ??? ?cout << strName << " : " << nAge << endl;
?? ??? ??? ?}
};
function<void (string, int)> f;?? ???? // 或者? function2<void, string, int> f;
CStudent stu;
f = stu;
cout << "f(\"hello\", 25)=" << f("hujian", 25) << endl;
◆?? ?成員函數用法
?struct TAdd
{
?? ?int Add(int x,int y)
?? ?{
?? ??? ?return x+y;
?? ?}
};
?? ??? ? TAdd tAdd;
?? ????? function<int? (tAdd *,int,int)> f;?? ??? ?// 或者? function<int? (tAdd &,int,int)> f;
?? ???? f = & TAdd::Add;
?? ???? cout << f(&tAdd, 2, 3);?? // 如果前面的模板參數為值或引用,直接傳入tAdd即可
其中,模板參數的tAdd *為類的實例的指針,當然也可以傳入類的實例或其引用,只不過調用時需要做相應的修改。
使用function時,可以通過empty函數或與0比較來判斷其是否指向一個有效的函數。如果function沒有指向一個有效的函數,調用時會拋出bad_function_call的異常。function的clear函數可以使其不再關聯到一個函數或函數對象,如果該function本身就是空的,調用該函數也不會帶來任何問題。
以上介紹了function庫的最基本的一些用法,關于function庫的其他應用,大家可以參考《Beyond the C++ STL》。
總結
以上是生活随笔為你收集整理的Boost库之function的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MTU MSS 详解记录
- 下一篇: 三星登上央视:LCD生产线全都关闭