1. 程式人生 > >[C++] Variadic Fuction Template 可變引數函式模板

[C++] Variadic Fuction Template 可變引數函式模板

可變引數函式模板(variadic function template)主要使用了包擴充套件(pack expansion)的方式,即”...”,把一個模式(pattern)擴充套件為包中每一個元素(element)的形式;可變引數函式模板一般會使用遞迴(recursive)來處理包(pack)引數。一般來說需要兩個函式:

  1. 需要一個非可變引數(nonvariadic)函式模板,當結束遞迴,最後一次呼叫時,會呼叫非可變引數版本,從而結束遞迴
  2. 需要一個繫結的引數,處理包(pack)中的一些元素,通過遞迴來順次處理包中的元素

利用sizeof...(args)可以輸出args中包括多少個引數。

下面是示例:

#include <iostream>
using namespace std;

/*通用可變引數模板*/
void showall()//空函式,介面
{

}
//使用情景:處理不限定個數的引數,處理不同型別的引數
template <typename T, typename...Args>
//對通用可變引數模板引用如下
//void showall(T &value, Args & ...args)
void showall(T value, Args... args)
{	
	cout << sizeof...(args) << endl;
	std::cout << value << std::endl;
	showall(args...);//繼續傳遞引數,呼叫的是自己,是遞迴呼叫
}

int main()
{
	int num1 = 100;
	int num2 = 200;
	int num3 = 300;
	char c = 'A';
	showall(num1, num2, num3, c);
	
	while (1);
	return 0;
}