만약 2개 이상의 매개변수를 받는 템플릿을 작성할 건데, 그 매개변수 개수가 몇 개가 될지 모른다면 어떻게 할 것인가? 그럴 때 가변인자 템플릿을 쓴다. 다음과 같이 쓴다.
template<typename T, typename... Args>
void Show_list3(T value, Args... args)
{
cout << value << ", ";
Show_list3(args...);
}
저 '...'은 뒤에 생략이 돼있다는 뜻이 아니라, 진짜 쩜쩜쩜을 적은 것이다. 물론 의미는 여러 개의 변수를 나타낸다. 안 써주면 안 된다. 어쨌든 이런 식으로 적으면 2개 이상의 템플릿 매개변수를 받을 때 자동으로 변환해준다. 여기서 Args는 템플릿 매개변수 팩, args는 함수 매개변수 팩이라 부른다. 매개변수가 여러 개 들어갈 수 있으니 팩이라 부르나보다.
가변인자 템플릿은 웬만해서는 재귀로 사용해야된다. 왜? 딱히 접근할 인자가 없기 때문이다. args팩에 변수가 여러 개 들어왔을 때 그거 하나하나 어떻게 처리할 것인가? 그리고 제2 매개변수부터 Args가 들어올 수 있다. 무슨 말이냐면,
template<typename... Args>
void Show_list3(Args... args)
{
Show_list3(args...);
}
이렇게 쓰면 안된다는 것이다. 왜? 이거 무한 재귀 함수다. 언제 끝내야 할 지 모른다. 그래서 제일 처음에 적은 식으로 제1 매개변수로 T를 하나 넣고, 제2 매개변수로 템플릿 매개변수 팩을 쓰면, 하나씩 처리가 가능하다. 매개변수 하나로 호출해도 적용되나? 된다. 왜? Args는 None도 포함하기 때문이다. 다음은 가변인자 템플릿의 예시 코드다.
void Show_list3() {}
template<typename T, typename... Args>
void Show_list3(T value, Args... args)
{
cout << value << ", ";
Show_list3(args...);
}
int main()
{
int n = 14;
double x = 2.71828;
std::string mr = "Mr. String objects!";
Show_list3(n);
cout << endl << "-----------------------" << endl;
Show_list3(n, x);
cout << endl << "-----------------------" << endl;
Show_list3(x * x, '!', 7, mr);
}
실행 결과.