C++11:变长模板的迭代与递归扩展


Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /www/wwwroot/fawdlstty.com/wp-content/plugins/wp-syntax/wp-syntax.php on line 383

Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /www/wwwroot/fawdlstty.com/wp-content/plugins/wp-syntax/wp-syntax.php on line 383

迭代的运行效率始终强于递归,递归始终比迭代方便开发。
变长模板属于C++11中比较复杂的技术,在此简单介绍下。在此贴出一个变长模板代码,为方便起见,参数类型全为int。如果需要不同的参数类型,只需要重载模板代码即可:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
template<class ... Args>
int Sum (Args... args) {
    return sizeof...(args);
}
 
int main (int argc, char* argv []) {
    cout < < Sum (1,2,23,124,4,23,43,24,32,4,23) << endl;
    return 0;
}

这是一个最简单的变长模板,首先是template定义,class后面加三个点就代表不固定长度。
接下来是Sum函数,在main函数的调用中实例化,被扩展为如下形式:

1
int Sum(int,int,int,int,int,int,int,int,int,int,int);

传了11个参数,就被实例化为11个参数形式。然后是sizeof...,这个宏是用来获取变长模板中元素的个数用的。我们调用时传了11个参数,它就返回11。程序运行的结果也相应为11。变长模板对于变长参数的优势之一为第一个参数不用定义参数个数(关于变长参数的访问详见深度研究C语言变长函数),但相应的劣势为无法直接访问参数。文章后面将简要介绍如何调用参数。
继续阅读C++11:变长模板的迭代与递归扩展