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

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

相关文章
|
1月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
89 10
|
3月前
|
编译器 C++
【C++】——初识模板
【C++】——初识模板
【C++】——初识模板
|
4月前
|
程序员 C++
C++模板元编程入门
【7月更文挑战第9天】C++模板元编程是一项强大而复杂的技术,它允许程序员在编译时进行复杂的计算和操作,从而提高了程序的性能和灵活性。然而,模板元编程的复杂性和抽象性也使其难以掌握和应用。通过本文的介绍,希望能够帮助你初步了解C++模板元编程的基本概念和技术要点,为进一步深入学习和应用打下坚实的基础。在实际开发中,合理运用模板元编程技术,可以极大地提升程序的性能和可维护性。
|
21天前
|
编译器 程序员 C++
【C++打怪之路Lv7】-- 模板初阶
【C++打怪之路Lv7】-- 模板初阶
13 1
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
37 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
1月前
|
算法 编译器 C++
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
72 2
|
1月前
|
存储 编译器 C++
【C++篇】引领C++模板初体验:泛型编程的力量与妙用
【C++篇】引领C++模板初体验:泛型编程的力量与妙用
37 2
|
1月前
|
存储 算法 编译器
【C++】初识C++模板与STL
【C++】初识C++模板与STL
|
1月前
|
编译器 C++
【C++】模板进阶:深入解析模板特化
【C++】模板进阶:深入解析模板特化
|
2月前
|
存储 算法 程序员
C++ 11新特性之可变参数模板
C++ 11新特性之可变参数模板
53 0