STUDY/C++
C++ - 가변 인자 템플릿 (Variadic Template)
최디디
2022. 3. 21. 10:09
기존 템플릿은 인자의 타입, 이름, 갯수를 명시하고
그대로만 사용했었다. 따라서, 인자의 수가 다르면
새로운 템플릿을 만들어야 했는데, C++ 11에서는 이러한 불편함을
해소하고자, 가변 인자 템플릿을 도입했다.
#include <iostream>
template <typename T>
void print(T arg) {
std::cout << arg << std::endl;
}
template <typename T, typename... Types>
void print(T arg, Types... args) {
std::cout << arg << ", ";
print(args...);
}
int main() {
print(1, 3.1, "abc");
}
typename ... 다음에 온 "Types"은 Parameter Pack이라고 한다.
그리고 print 함수 파라미터에서의 Types... args를 Function Parameter Pack이라고 한다.
0개 이상의 템플릿이나 함수 인자를 받는 다는 뜻이다.
하나의 함수 파라미터 팩으로, 여러 인자를 받는 다는 건
재귀적으로 동작한다는 걸 의미함.
print(1, 3.1, "abc");
위 함수가 동작하게 되면
첫번째 인자 int형으로 첫번째 print가 호출이 된다.
파라미터 팩이 없는 함수의 우선순위가 높기때문이다.
따라서 기본 템플릿 print 함수 순서가 가변인자 템플릿 보다
아래에 있다면 오류가 컴파일러는 함수를 찾지 못해 오류가 난다.
sizeof...는 가변 길이 변수의 개수, 즉, 전체 인자의 개수를 리턴한다.
이 사이즈는 마지막에 인자가 없을때까지 재귀적으로 함수를 돈다.