`...` 구문은 가변 인자를 받을 수 있게 된다. 가변 템플릿은 템플릿의 매개 변수로 여러 개의 인자를 받을 수 있도록 하는 기능이다.
이는 함수나 클래스 템플릿을 정의할 때, 인자의 개수가 동적으로 변할 수 있을 때 유용하게 사용된다.
이때, 인자의 갯수는 0개 이상을 받을 수 있다.
이렇게 최소 한개 이상의 가변 인자를 받는 템플릿을 "가변 템플릿"이라고 한다.
#include <iostream>
template <typename... T>
struct Arity {
constexpr static int value = sizeof...(T);
};
int main(void)
{
static_assert(Arity<>::value == 0, ""); // OK
static_assert(Arity<int, char, short>::value == 3, ""); // OK
return 0;
}
위의 예시를 보면 템플릿의 매개 변수를 아예 받지 않거나 여러 개를 받았을 때의 모습을 확인할 수 있다.
다음 예시는 가변 템플릿을 사용하는 예시를 보도록 하겠다.
template<typename T>
void Print(const T& value)
{
std::cout << value << " ";
}
template <typename T, typename... Args>
void Print(const T& value, const Args&... args)
{
std::cout << value << " ";
Print(args...);
}
int main(void)
{
Print("hello", 1, 2.7, 'a');
return 0;
}
다양한 타입의 인자를 받아들이는 것을 확인할 수 있다.
이때 `Print` 함수가 재귀를 돌면서 각각의 인자를 차례대로 호출하는 것을 볼 수 있다.
template <typename First, typename... Args>
auto sum(const First first, const Args... args) -> decltype(first)
{
const auto values = {first, args...};
return std::accumulate(values.begin(), values.end(), First{0});
}
int main(void)
{
std::cout << sum(1, 2, 3) << std::endl;
return 0;
}
위의 예시는 가변 인자를 이용해 "initializer list"를 만들고 이를 통해 가변 인자의 요소를 가리킬 수 있게 되었다.
[C++11] Rvalue references (0) | 2023.08.28 |
---|---|
[C++11] Forwarding References(Universal References) (0) | 2023.08.28 |
[C++11] Initializer lists (0) | 2023.08.28 |
[C++11] Static Assertions (0) | 2023.08.26 |
[C++11] auto (0) | 2023.08.26 |