閱讀本文需要理解 C++ 變長模板、函數重載等基本操作,可以自行百度別的博客
void eat(int i)
{
cout << "eat " << i << endl;
}
void eat(char c)
{
cout << "eat " << c << endl;
}
// 利用重載完成對不同參數的處理
template<typename T> // 最短的模板已經定義好了,當編譯到dinner(T)時就會觸發這裏的編譯
void dinner(T t)
{
eat(t);
}
template<typename T, typename ...Args> // 關鍵,如何定義變長類型參數
void dinner(T dish, Args... rest_of_the_meal) // 如何把變長類型參數對應到變長函數參數
{ // 這裏我認爲可以理解爲類似 python 的 zip (Args, rest_of_the_meal)
// 即把兩個列表(type1, type2...), (arg1, arg2 ...)變成
eat(dish); // type1 arg1, type2 arg2... 的形式
dinner(rest_of_the_meal...); // 觸發對短一些的模板的編譯
}
測試:
dinner(0, 'a', 'b', 'c', 1);
結果:
eat 0
eat a
eat b
eat c
eat 1
可以看到這樣我們就可以對不同類型的函數參數進行處理,比起 C 的 實現方式來看,我們利用了原生的類型系統對不同類型的參數進行了處理,寫起來比較方便和安全