变长参数模板

C++03只有固定模板参数。C++11 加入新的表示法,允许任意个数、任意类别的模板参数,不必在定义时将参数的个数固定。

实参的个数也可以是 0,所以 tuple<> someInstanceName 这样的定义也是可以的。

若不希望产生实参个数为 0 的变长参数模板,则可以采用以下的定义:

变长函数参数包

除了在模板参数中能使用表示不定长模板参数外,函数参数也使用同样的表示法代表不定长参数。

其中,Params 与 parameters 分别代表模板与函数的变长参数集合, 称之为参数包 (parameter pack)。参数包必须要和运算符”…”搭配使用。

变长参数的使用

长参数模板中,变长参数包无法如同一般参数在类或函数中使用; 因此典型的手法是以递归的方法取出可用参数:

printf 会不断地递归调用自身:函数参数包 args... 在调用时, 会被模板类别匹配分离为 T value和 Args... args。 直到 args... 变为空参数,则会与简单的 printf(const char *s) 形成匹配,退出递归。

另一个例子为计算模板参数的个数,这里使用相似的技巧展开模板参数包 Args...

其它变长参数的展开形式

使用运算符”…”还能在代码各处对参数包施以更复杂的展开操作。举例来说,一个模板类的定义:

变长模板参数个数

变长参数的数量可以藉以下的语法得知:

发表评论

电子邮件地址不会被公开。 必填项已用*标注