C++11新特性之变长参数模板的示例分析(C++,开发技术)

时间:2024-05-03 20:14:23 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    C%2B%2B11%E6%96%B0%E7%89%B9%E6%80%A7%E4%B9%8B%E5%8F%98%E9%95%BF%E5%8F%82%E6%95%B0%E6%A8%A1%E6%9D%BF%E7%9A%84%E7%A4%BA%E4%BE%8B%E5%88%86%E6%9E%90

在C++11之前,无论是类模板 还是函数模板,都只能按其指定的样子,接受一组固定数量的模板参数;

这已经大大提升了代码的复用!

在C++11之后,加入了新的表示方 法,允许任意个数、任意类别的模板参数,同时也不需要在定义时将参数的个数固定。更加像”黑魔法“了。

模板类 Magic 的对象,能够接受不受限制个数的 typename 作为模板的形式参数,例如下面的定义:

既然是任意形式,所以个数为 0 的模板参数也是可以的:class Magic<> nothing;。 如果不希望产生的模板参数个数为 0,可以手动的定义至少一个模板参数:

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

传统 C 中的 printf 函数,虽然也能达成不定个数 的形参的调用,但其并非类别安全。而 C++11 除了能定义类别安全的变长参数函数外,还可以使类似 printf 的函数能自然地处理非自带类别的对象。除了在模板参数中能使用 ... 表示不定长模板参数外, 函数参数也使用同样的表示法代表不定长参数,这也就为我们简单编写变长参数函数提供了便捷的手段, 例如:

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

长参数模板中,变长参数包无法如同一般参数在类或函数中使用;这个很好理解!

因为在栈中,我们需要先知道函数有多少个参数,才可以入栈,但是我们不知道变长参数有多长,所以需要特殊手法!

首先,我们可以使用 sizeof... 来计算参数的个数,:

递归去获得所有参数,是非常容易想到的方法,这种方法不断递归地向函数传递模板参数,进而达到递归遍历所有模板参数的目的。

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

上面的递归很容易理解,但是比较繁琐,那么还有没有什么好方法呢?

在 C++17 中增加了变参模板展开的支持,于是你可以在一个函数中完 成 printf 的编写:

本文:C++11新特性之变长参数模板的示例分析的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:django怎么用分词器实现站内检索功能下一篇:

3 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18