C++ 中的可变参数函数模板

796 阅读2分钟

「这是我参与11月更文挑战的第 1 天,活动详情查看:2021最后一次更文挑战」。

可变参数模板是接受可变数量参数的模板。可变参数函数模板是可以接受多个参数的函数。

可变参数函数模板的语法:

template <typename arg, typename... args>
return_type function_name(arg var1, args... var2)

/*
* 注意: typename arg, typename… 参数必须在尖括号内。
*/

下面是一个 C++ 示例,演示如何使用可变参数函数模板:


/// @note 演示可变参数函数模板的 C++ 程序
#include <iostream>
using namespace std;

/// @note 处理以下递归可变参数函数模板的基本情况(空函数)
void print()
{
    cout << "I am empty function and "
            "I am called at last.\n";
}

/// @note 可变参数函数模板
/// 接受可变数量的参数并打印所有参数。
template <typename T, typename... Types>
void print(T var1, Types... var2)
{
    cout << var1 << endl;

    print(var2...);
}

/// @note 入口代码
int main()
{
    print(1, 2, 3.14, "Pass me any "
                      "number of arguments",
          "I will print\n");

    return 0;
}

输出结果

image.png

请记住,编译器会将模板替换为实际的函数。

可变参数模板的工作原理如下:

该代码会按照下面的方式来进行评估

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

首先,编译器将语句解析为

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

现在,编译器找到一个可以接受这些参数的 print() 函数,并以类似的方式再次执行变量 print() 函数:

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();

此时,编译器搜索匹配空函数的函数重载,即没有参数的函数。

这意味着,所有有 1 个或多个参数的函数都匹配可变参数模板,所有没有参数的函数都匹配空函数

(完)