「这是我参与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;
}
输出结果
请记住,编译器会将模板替换为实际的函数。
可变参数模板的工作原理如下:
该代码会按照下面的方式来进行评估
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 个或多个参数的函数都匹配可变参数模板,所有没有参数的函数都匹配空函数。
(完)