




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第C++11新增的包裝器詳解目錄functionbind
function
目前,我們的知識深度已知的可調(diào)用對象類型有:
函數(shù)指針仿函數(shù)/函數(shù)對象lambda表達(dá)式
現(xiàn)在我們有一個函數(shù)模板
templateclassF,classT
TuseF(Ff,Tx)
staticintcount=0;
cout"count:"countendl;
returnf(x);
對于函數(shù)模板,編譯器會根據(jù)實參,按照模板定義出一份特定的函數(shù)。
函數(shù)內(nèi)部的靜態(tài)成員變量是屬于函數(shù)的,無論調(diào)用多少次該函數(shù),都只會定義出一個。
記住上面這兩個知識點,現(xiàn)在增加一個函數(shù)和仿函數(shù),用來測試useF函數(shù)模板
intSub(intnum)
return(num-2);
structFunc
intoperator()(intnum)
return(num-3);
intmain()
//函數(shù)名
coutuseF(Sub,4)endl;
//函數(shù)對象
coutuseF(Func(),4)endl;
//lambda表達(dá)式
coutuseF([](intd)-int{return(d-4);},11.11)endl;
return0;
}
解釋運行結(jié)果:我們在函數(shù)模板內(nèi)部實現(xiàn)打印靜態(tài)成員變量,發(fā)現(xiàn)三次打印的cout地址不一樣。然而靜態(tài)成員變量是屬于函數(shù)的,一個函數(shù)的靜態(tài)成員變量無論調(diào)用多少次都只有一份。這說明是三個不同的函數(shù)調(diào)用。
以lambda表達(dá)式為例,一個lambda表達(dá)式語句就生成一個自定義類型(仿函數(shù)),那么多次調(diào)用會根據(jù)模板產(chǎn)生非常多的函數(shù)。
intmain()
//函數(shù)名
coutuseF(Sub,4)endl;
//函數(shù)對象
coutuseF(Func(),4)endl;
//lamber表達(dá)式
coutuseF([](intd)-int{return(d-4);},11.11)endl;
coutuseF([](intd)-int{return(d-4);},11.11)endl;
return0;
}
其他可調(diào)用對象的類型也是很多的,許多的函數(shù)指針,許多的仿函數(shù)類,許多的lambda表達(dá)式。類型太豐富了!對于一個模板而言,類型不同,就會對應(yīng)定義出一份。模板的效率也降低了太多。
C++11提供了包裝器,包裝器可以將可調(diào)用對象統(tǒng)一包裝成一個類型。function就是一個包裝器,也可稱為適配器
function
#includefunctional
templateclassRet,class...Args
classfunctionRet(Args...)
Ret(Args):第一個模板參數(shù)類型(參數(shù)包)
測試:
templateclassF,classT
TuseF(Ff,Tx)
staticintcount=0;
//cout"count:"++countendl;
cout"count:"countendl;
returnf(x);
intmain()
functionint(int)f1=[](intd)-int{return(d-4);};
functionint(int)f2=[](intd)-int{return(d-4);};
functionint(int)f3=[](intd)-int{return(d-4);};
//lamber表達(dá)式
coutuseF(f1,5)endl;
coutuseF(f2,5)endl;
coutuseF(f3,5)endl;
return0;
}
上面調(diào)用的都是同一個函數(shù)。
一個lambda表達(dá)式語句會生成一個類,上面有三個lambda表達(dá)式語句,生成三個類。使用function包裝器將這些可調(diào)用對象包裝成了一個類型,模板也就只需要定義出一份特定的,極大地提升了模板的效率。
【普通函數(shù)指針】
包裝用法:functionRet(Args...)對象名=函數(shù)指針
//例如
intSub(intx,inty)
returnx-y;
intmain(void)
//包裝函數(shù)指針
functionint(int,int)f1=Sub;
coutf1(12,8)endl;
return0;
}
【仿函數(shù)】
包裝用法:functionRet(Args)對象名=仿函數(shù)類()
classSub
public:
intoperator()(intx,inty)
return(x-y);
intmain(void)
functionint(int,int)f2=Sub();
return0;
【靜態(tài)類成員函數(shù)指針】
包裝方法:functionRet(Args)對象名=類域::函數(shù)指針
可以不加,不影響結(jié)果,但是加上要更優(yōu)一些。
classSub
public:
staticintSubStatic(intx,inty)
return(x-y);
intmain(void)
functionint(int,int)f2=Sub::SubStatic;
coutf2(10,3)endl;
functionint(int,int)f3=Sub::SubStatic;
coutf2(10,3)endl;
return0;
}
【非靜態(tài)類成員函數(shù)指針】
包裝方法:functionRet(類域名,Args)對象名=類域::函數(shù)指針
classSub
public:
intSubMember(intx,inty)
return(x-y);
intmain(void)
functionint(Sub,int,int)f4=Sub::SubMember;
coutf4(Sub(),3,1)endl;
return0;
}
非靜態(tài)類成員函數(shù)指針包裝后,使用包裝后的對象進(jìn)行調(diào)用,第一個參數(shù),必須是類名。
【lambda表達(dá)式】
包裝方法:functionRet(Args)對象名=lambda表達(dá)式
intmain(void)
functiondouble(double,double)f5=[](doublex,doubley)mutable-double{returnx-y;};
coutf5(2.23,1.11)endl;
return0;
bind
bind也是一個包裝器。
作用一:調(diào)整參數(shù)的順序
普通函數(shù)指針的包裝方法:functionRet(Args...)對象名=bind(函數(shù)指針,newArgs)
intSub(intx,inty)
returnx-y;
intmain(void)
//function、bind包裝函數(shù)指針
functionint(int,int)f1=Sub;
//將第一個參數(shù)和第二個參數(shù)交換
functionint(int,int)f2=bind(Sub,placeholders::_2,placeholders::_1);
coutf1(12,8)endl;
coutf2(12,8)endl;
return0;
}
placeholders::_n,表示當(dāng)前function類中參數(shù)包的第n個參數(shù)。
希望怎么調(diào)整參數(shù)的順序,就在調(diào)用bind函數(shù)時,傳遞什么樣的參數(shù)順序。bind函數(shù)傳參時,使用placeholders::_n。
作用二、指定某個參數(shù)的值
#includeiostream
#includefunctional
usingnamespacestd;
intSub(intx,inty)
returnx-y;
intmain(void)
//function、bind包裝函數(shù)指針
functionint(int,int)f2=bind(Sub,10,placeholders::_2);
coutf2(12,8)endl;
return0;
}
使用function和bind包裝過后,并且指定了某個參數(shù)的值。function實例化的時候可以省略掉指定了值的參數(shù)的參數(shù)類型。省略掉后要注意維護bind函數(shù)內(nèi)的參
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 政治學(xué)期末試題及答案
- 2025年網(wǎng)絡(luò)規(guī)劃設(shè)計師考試高效應(yīng)對試題及答案
- 初級社會工作者的潛在發(fā)展領(lǐng)域與挑戰(zhàn)試題及答案
- 社會工作的社會角色與功能分析中級考試試題及答案
- 交規(guī)考試題及答案下載
- 寒假物理試題及答案
- 聰明復(fù)習(xí)策略初級社會工作者考試試題及答案
- 2025房地產(chǎn)交易合同模板
- 2025資產(chǎn)抵押借款合同版
- 信永中和筆試題目及答案
- 中國世界文化遺產(chǎn)監(jiān)測預(yù)警指標(biāo)體系
- 日本表參道項目案例分析
- GB/T 17772-2018土方機械保護結(jié)構(gòu)的實驗室鑒定撓曲極限量的規(guī)定
- 腦卒中風(fēng)險評估(改良的弗明漢卒中量表)老年健康與醫(yī)養(yǎng)結(jié)合服務(wù)管理
- 09S304 衛(wèi)生設(shè)備安裝圖集
- 《弟子規(guī)》謹(jǐn)篇(課件)
- 膝關(guān)節(jié)骨性關(guān)節(jié)炎的防治課件
- 防蛇蟲咬傷防中暑課件
- 車輛購置稅和車船稅課件
- 國開電大《人員招聘與培訓(xùn)實務(wù)》形考任務(wù)4國家開放大學(xué)試題答案
- 2023年徐州市泉山區(qū)工會系統(tǒng)招聘考試筆試題庫及答案解析
評論
0/150
提交評論