C++11变长参数模板

C++11变长参数模板

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

  

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

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

  

变长函数参数包

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

   

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

变长参数的使用

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

  C++11变长参数模板_第1张图片

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

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

  C++11变长参数模板_第2张图片

其它变长参数的展开形式

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

  C++11变长参数模板_第3张图片

变长模板参数个数

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

  C++11变长参数模板_第4张图片

  SomeStruct<Type1, Type2>::size 是 2,而 SomeStruct<>::size 会是 0。 (sizeof...(Args) 的结果是编译期常数。)

 参考:http://zh.wikipedia.org/wiki/C++0x#-.7BA.7Czh-hans:.E5.8F.98.E9.95.BF.E5.8F.82.E6.95.B0.E6.A8.A1.E6.9D.BF.3B_zh-hant:.E4.B8.8D.E5.AE.9A.E9.95.B7.E5.8F.83.E6.95.B8.E6.A8.A1.E6.9D.BF.7D-

你可能感兴趣的:(C++)