C++11新增的包裝器詳解_第1頁
C++11新增的包裝器詳解_第2頁
C++11新增的包裝器詳解_第3頁
C++11新增的包裝器詳解_第4頁
C++11新增的包裝器詳解_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論