★10.關(guān)于可變參數(shù)模板

可變參數(shù)函數(shù)模板

// Args稱為模板參數(shù)包,rest稱為函數(shù)參數(shù)包
template <typename T, typename ... Args>
void fun(T t, const Args & ... rest) {
}

可變參數(shù)類模板

// Args稱為模板參數(shù)包,rest稱為函數(shù)參數(shù)包
template <typename T, typename ... Args>
class A {
};

int main() {
    A<int, int, double> a;
    return system("pause");
}

可變參數(shù)函數(shù)模板的使用

// Args稱為模板參數(shù)包,rest稱為函數(shù)參數(shù)包
template <typename T, typename ... Args>
void fun(T t, const Args & ... rest) {
    // 獲取模板參數(shù)包中的參數(shù)個數(shù)
    std::cout << sizeof...(Args) << std::endl;
    // 獲取函數(shù)參數(shù)包中的參數(shù)個數(shù)
    std::cout << sizeof...(rest) << std::endl;

    // 可以利用遞歸處理每一個函數(shù)參數(shù)包中的參數(shù)
    // 相比上面的函數(shù)參數(shù)少了一個參數(shù),可以知道函數(shù)參數(shù)包里的參數(shù)會一個一個減少
    fun(rest...);                          // rest...代表函數(shù)包拓展,代表著拓展為函數(shù)實參列表
//    fun(change(rest)...);                  // 更復雜的函數(shù)包拓展,每個參數(shù)都先用change函數(shù)處理一下并返回
};

// 巧妙點:上述的遞歸中,當最后一個參數(shù)時會調(diào)用更特例化版本,避免了模板參數(shù)包為0的報錯
template <typename LastOne>
void fun(const LastOne & lastOne) {
    std::cout << "The End!" << std::endl;
}

template <typename T>
int change(T t) {
    return 0;               // 想作為包拓展的模式,必須要有返回值
}

int main() {
    int i1 = 0;
    double i2 = 0;
    char i3 = 0;
    float i4 = 0;
    // 備注:模板參數(shù)包的參數(shù)個數(shù)不可以為0,以下調(diào)用模板參數(shù)包的個數(shù)為4
    fun(i1, i2, i3, i4);    // fun<int, double, char, float>
    return system("pause");
}

轉(zhuǎn)發(fā)參數(shù)包

// 轉(zhuǎn)發(fā)參數(shù)包
template <typename ... Args>
void fun1(Args && ... rest) {
    // 轉(zhuǎn)發(fā)參數(shù)包給fun2(),此處非遞歸調(diào)用只是將所有的參數(shù)包簡單地轉(zhuǎn)發(fā)了一下
    fun2(std::forward<Args>(rest)...);             // 同時應用了模板參數(shù)包拓展和函數(shù)參數(shù)包拓展
}

template <typename T, typename ... Args>
void fun2(T t, Args ... rest) {
    fun2(rest...);                              // 遞歸調(diào)用,函數(shù)參數(shù)包會一個一個減少
};

// 當只有一個參數(shù)時,會調(diào)用這個更特例化的版本
template <typename T>
void fun2(T t) {
    std::cout << "The End!" << std::endl;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容