類似于可變參數(shù)列表驹闰,它為函數(shù)模版和類模版提供了一種可接受多個參數(shù)的途徑,它可以使函數(shù)接受任意數(shù)量任何類型的參數(shù)皿桑。
這個可變參數(shù)模版毫目,有4個關(guān)鍵因素:1、模版參數(shù)包诲侮;2镀虐、函數(shù)參數(shù)包;3沟绪、解包刮便;4、遞歸绽慈。
它把模版的類型與參數(shù)分開來考慮恨旱,如下圖所示:
T是模版的參數(shù)列表,而value則被當(dāng)做函數(shù)的參數(shù)列表來看待坝疼。當(dāng)你實例化一個函數(shù)模版搜贤,就是向模版?zhèn)饕粋€實參時,實參的類型實例化了T钝凶,實參的值實例化了value仪芒。
模版的可變參數(shù)列表語法如下所示:
這個感覺就像在原來的模版參數(shù)寫法上的typename后面加上三個點,又因為此時Args代表了函數(shù)參數(shù)的類型,此時也要在Args后面加上三個點掂名。此時的Args被稱為類型包夭咬,而args被稱為參數(shù)包,當(dāng)然具體的名字可以隨便取铆隘。你一旦完成了這個可變參數(shù)列表的模版卓舵,就可以像下圖這樣使用它:
解包是指什么意思呢?你通過一個可變參數(shù)列表把一大堆的參數(shù)傳進來膀钠,但是你如果想對這個參數(shù)列表中的某個參數(shù)進行操作時該怎么指示這個參數(shù)呢掏湾,那就需要解包。
這里show_list1是個迭代的過程肿嘲,通過在函數(shù)內(nèi)show_list1的參數(shù)args后面加上三個點就可以把參數(shù)列表整體傳進來融击。但是這會造成一個無限遞歸,所以這個不好雳窟。
因此該技術(shù)提出了一種解決辦法尊浪,那就是每次迭代都處理第一個參數(shù),如此往復(fù)總有那么一個時刻會把參數(shù)處理完封救。那么它的處理方式如下所示:
實例如下:
在main函數(shù)中的使用方法如下所示:
但是如上面的聲明式所示拇涤,該函數(shù)模版使用的是值傳遞,這對于大型的參數(shù)而言效率太低誉结,于是該可以使用const修飾符在參數(shù)聲明上鹅士。