前言
初接触类模版与函数模版时,虽然感觉这是C++与C对比非常不一样的一个特性。可是也就仅此,固定数量的模版参数,并未让我感觉到这是一项多么酷炫的特性。
而在C++11中,C++引入了一项新特性。这项特性允许开发者表示0到任意个数、类型的参数。
参考:
wiki
基本语法
1 2 3 4 5 6 7 8
| template<typename T> void fucc(T t); template<typename... Arguments> void fuc(Arguments... args); int main() { fucc(1); fuc(1,2,3,4,5); }
|
在模版参数的左侧出现省略号…,声明一个参数包(parameter pack)。
而省略号出现在包含参数包的表达式的右侧,则把这个参数包解开为一组实参,使得在省略号前的整个表达式使用每个被解开的实参完成求值,所有表达式求值结果被逗号分开。
参数包处理
初见参数包展开,想必可能会心存幻想。认为参数包传递后,对于参数的使用是十足所见即所得的。然而事实是,参数包的处理需要各种奇淫巧技。
主要的方法有:
递归使用
哑扩展标记
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| void tfuc() { cout << "tfuc end" << endl; } template<typename T,typename... Args> void tfuc(T t,Args... args) { cout << t << endl; tfuc( args... ); } template<typename T> T prin(T t) { cout << t << endl; return t; } template<typename... Args> void pass(Args... args){} template<typename... Args> void tfuc2(Args... args) { pass( prin(args)... ); } int main() { tfuc(1,"hello"); tfuc2(2,"world"); }
|