可變參數(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ā)布平臺,僅提供信息存儲服務。