可变参数列的模板C++ Variadic Template

enter image description here

可变参数列的模板就是模板的参数个数不确定

基本语法形式

函数模板

template return_type function_name(arg var1, args... var2);

两个术语or概念 - parameter pack … args - parameter expansion args …

// C++ program to demonstrate working of
// Variadic function Template
#include <iostream>
using namespace std;

// To handle base case of below recursive
// Variadic function Template
void print()
{
    << "I am empty function and "
            "I am called at last.\n";
}

// Variadic function Template that takes
// variable number of arguments and prints
// all of them.
template <typename T, typename... Types>
void print(T var1, Types... var2)
{
   cout << var1 << endl;

    print(var2...);
}

// Driver code
int main()
{
    print(1, 2, 3.14,
      "Pass me any "
      "number of arguments",
      "I will print\n");

    return 0;
}

这样的模板编译器如何resolve?工作流程如下: 上面的ariadic 函数模板print如何展开? 语句print(1, 2, 3.14, “Pass me any number of arguments”, “I will print\n”); i, 以如下形式被展开: 首先,编译器resolve该语句为:

cout<< 1 <<endl ;
print(2, 3.14, "Pass me any number of arguments", 
      "I will print\n");

以此类推:

cout<< 2 <<endl ;
print(3.14, "Pass me any number of arguments", 
      "I will print\n");

继续展开,都是县取出第一个参数:

cout<< 3.14 <<endl ;
print("Pass me any number of arguments", 
      "I will print\n");

继续:

cout<< "Pass me any number of arguments" <<endl ;
print("I will print\n");

直到最后一个参数:

cout<< "I will print\n" <<endl ;
print();

这里主要简单复习了一下函数模板,可变参数的类模板更丰富一些

Variadic 类模板

【todo】

小结一下

  • 参数包
  • 参数展开
  • elipsis:省略号三个点...
  • parameter vs argument
  • fold expressions?

参考

评论