C++11 可变参数模板(上)

简介: C++11 可变参数模板

可变参数模板的概念

可变参数是C++11新增的比较重要的特性之一

它对参数高度泛化 能够让我们创建接受可变参数的函数模板还有类模板

  • 在C++11之前模板只能使用固定个数参数 所以可变参数模板特性无疑是一个巨大的进步 但是可变参数模板比较抽象 使用起来需要一定的技巧
  • 其实在C++11之前就已经有了可变参数这个概念 比如说库函数中的printf函数 它就可以接受多个参数 但是这只是函数参数的可变参数 并不是模板的可变参数


可变参数模板的定义方式

在C++11中 可变参数模板的定义方式如下

template<class …Args>
返回类型 函数名(Args… args)
{
  //函数体
}


我们写出一个特化版本的函数

template<class ...Args>
void ShowList(Args... args)
{}


对于上面的代码我们这里予以解释

  • 模板参数 …Args 前面的省略号代表这是一个可变参数模板 我们将带有省略号的参数称为参数包 参数包里面可以有0~N(N > 0)个参数 args是参数包的形参
  • 它们的名字并不是一定要叫Args和args 可以修改为别的名称


使用了这个模板之后我们就可以使用多种参数来调用这个函数

ShowList();
  ShowList(1);
  ShowList(1, 'A');
  ShowList(1, 'A', string("hello"));

58cd8b44d1ad47c9886df9624b7fa439.png


我们还可以通过sizeof来计算函数到底调用了多少个参数

template<class ...Args>
void ShowList(Args... args)
{
  cout << sizeof...(args) << endl;
}


这里有一点特别重要 sizeof后面的…不能省略 否则编译器会报错

97881512e2ba44c8b9bf76370f5502af.png

修改正确后的运行结果如下

8769ead8491b42e4b322ed3ed510ce1a.png

虽然我们能很简单的通过sizeof关键字来获取参数包中参数的个数

但是我们缺很难知道参数包中每个参数的类型 这也是参数包使用中的一大难点

需要注意的是 我们不能通过下标访问操作符【】来访问参数包

cf464b1864b04d70b166090c2a772868.png

接下来我们会介绍两种获取参数包中各个参数的方式

相关文章
|
3月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
126 10
|
5月前
|
编译器 C++
【C++】——初识模板
【C++】——初识模板
【C++】——初识模板
|
2月前
|
安全 编译器 C++
【C++11】可变模板参数详解
本文详细介绍了C++11引入的可变模板参数,这是一种允许模板接受任意数量和类型参数的强大工具。文章从基本概念入手,讲解了可变模板参数的语法、参数包的展开方法,以及如何结合递归调用、折叠表达式等技术实现高效编程。通过具体示例,如打印任意数量参数、类型安全的`printf`替代方案等,展示了其在实际开发中的应用。最后,文章讨论了性能优化策略和常见问题,帮助读者更好地理解和使用这一高级C++特性。
63 4
|
6月前
|
程序员 C++
C++模板元编程入门
【7月更文挑战第9天】C++模板元编程是一项强大而复杂的技术,它允许程序员在编译时进行复杂的计算和操作,从而提高了程序的性能和灵活性。然而,模板元编程的复杂性和抽象性也使其难以掌握和应用。通过本文的介绍,希望能够帮助你初步了解C++模板元编程的基本概念和技术要点,为进一步深入学习和应用打下坚实的基础。在实际开发中,合理运用模板元编程技术,可以极大地提升程序的性能和可维护性。
|
2月前
|
算法 编译器 C++
【C++】模板详细讲解(含反向迭代器)
C++模板是泛型编程的核心,允许编写与类型无关的代码,提高代码复用性和灵活性。模板分为函数模板和类模板,支持隐式和显式实例化,以及特化(全特化和偏特化)。C++标准库广泛使用模板,如容器、迭代器、算法和函数对象等,以支持高效、灵活的编程。反向迭代器通过对正向迭代器的封装,实现了逆序遍历的功能。
37 3
|
2月前
|
编译器 C++
【c++】模板详解(1)
本文介绍了C++中的模板概念,包括函数模板和类模板,强调了模板作为泛型编程基础的重要性。函数模板允许创建类型无关的函数,类模板则能根据不同的类型生成不同的类。文章通过具体示例详细解释了模板的定义、实例化及匹配原则,帮助读者理解模板机制,为学习STL打下基础。
33 0
|
3月前
|
编译器 程序员 C++
【C++打怪之路Lv7】-- 模板初阶
【C++打怪之路Lv7】-- 模板初阶
24 1
|
3月前
|
存储 编译器 C++
【C++篇】引领C++模板初体验:泛型编程的力量与妙用
【C++篇】引领C++模板初体验:泛型编程的力量与妙用
55 9
|
3月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
72 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
3月前
|
算法 编译器 C++
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
99 2