C++ 利用變長模板生成類型安全的變參函數

閱讀本文需要理解 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 的 實現方式來看,我們利用了原生的類型系統對不同類型的參數進行了處理,寫起來比較方便和安全

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章