本篇文章給大家分享的是有關(guān)C++11中如何使用forward函數(shù),小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括磐安網(wǎng)站建設(shè)、磐安網(wǎng)站制作、磐安網(wǎng)頁制作以及磐安網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,磐安網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到磐安省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
傳值函數(shù)模板
假設(shè)有一組函數(shù),根據(jù)兩個(gè)輸入值進(jìn)行工作,例如下面的add函數(shù):
我們希望編寫一個(gè)函數(shù)模板來調(diào)用這些函數(shù)。
這個(gè)函數(shù)模板的使用方法如下:
程序員可以根據(jù)需要,修改函數(shù)名參數(shù)和兩個(gè)變量的類型。到目前為止算是準(zhǔn)備活動(dòng)。
左值引用參數(shù)函數(shù)模板
除了像add函數(shù)那樣,兩個(gè)參數(shù)都作為輸入的函數(shù)以外,也許還希望調(diào)用這樣的函數(shù):
在這些函數(shù)中,希望將通過引用類型將運(yùn)算結(jié)果輸出。這種情況下可以按一下方式定義函數(shù)模板:
函數(shù)模板2的使用方法如下:
這個(gè)函數(shù)模板可以使用add和inc兩種形式的函數(shù)。但是還有一個(gè)小問題:沒有辦法像第一種情況那樣使用常數(shù)作為參數(shù),因?yàn)槌?shù)是一個(gè)右值。
右值引用參數(shù)函數(shù)模板
為了解決左值引用參數(shù)模板的問題,可以定義右值引用參數(shù)函數(shù)模板。
有了這個(gè)模板之后,下面的代碼都可以正常編譯執(zhí)行。
在輸入?yún)?shù)的地方,指定常數(shù)也沒有問題。已經(jīng)很不錯(cuò)了。
前進(jìn)中的問題
如果我們想這個(gè)模板函數(shù)調(diào)用下面的函數(shù)呢?
下面的代碼是沒有辦法通過編譯的。
編譯錯(cuò)誤為在調(diào)用swap_rvalue時(shí)int無法轉(zhuǎn)換為int&&類型。
發(fā)生了什么
為了弄清楚函數(shù)模板內(nèi)部的情況,作者編寫了下面的函數(shù):
這的函數(shù)的功能是為了是取得本文中提到的類型T的實(shí)際類型。雖然并不完整,但是可以用來說明本文中遇到的問題。這個(gè)函數(shù)可以這樣使用:
輸出結(jié)果如下:
它正確的輸出了,int,int&和int&&的類型。我們可以吧showType嵌入到函數(shù)模板中:
為了回避編譯錯(cuò)誤,暫且屏蔽調(diào)用函數(shù)的部分。模板函數(shù)的輸出結(jié)果為:
由于發(fā)生了上一篇文章中說明的引用合并,T1,T2的類型分別變成了右值。這就是調(diào)用swap_int失敗的原因。
C++11的解決方式
為了解決模板函數(shù)中參數(shù)類型變化的問題,C++11中可以使用std::forward來恢復(fù)模板參數(shù)的左值或右值屬性。修改后的代碼如下:
在調(diào)用f之前,另外增加了兩行代碼以表示std::foward的執(zhí)行結(jié)果。程序輸出如下:
可以看到,調(diào)用時(shí)的類型被成功恢復(fù),swap_int函數(shù)也被正確的執(zhí)行了。不僅如此,下面的代碼都能正確執(zhí)行。
以上就是C++11中如何使用forward函數(shù),小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。