類似于可變參數(shù)列表,它為函數(shù)模版和類模版提供了一種可接受多個參數(shù)的途徑,它可以使函數(shù)接受任意數(shù)量任何類型的參數(shù)。
這個可變參數(shù)模版,有4個關(guān)鍵因素:1、模版參數(shù)包;2、函數(shù)參數(shù)包;3、解包;4、遞歸。
它把模版的類型與參數(shù)分開來考慮,如下圖所示:
T是模版的參數(shù)列表,而value則被當做函數(shù)的參數(shù)列表來看待。當你實例化一個函數(shù)模版,就是向模版?zhèn)饕粋€實參時,實參的類型實例化了T,實參的值實例化了value。
模版的可變參數(shù)列表語法如下所示:
這個感覺就像在原來的模版參數(shù)寫法上的typename后面加上三個點,又因為此時Args代表了函數(shù)參數(shù)的類型,此時也要在Args后面加上三個點。此時的Args被稱為類型包,而args被稱為參數(shù)包,當然具體的名字可以隨便取。你一旦完成了這個可變參數(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ù)聲明上。