상세 컨텐츠

본문 제목

[C++11] Variadic templates

C++/Modern C++(11, 14, 17, 20)

by deulee 2023. 8. 28. 14:57

본문

`...` 구문은 가변 인자를 받을 수 있게 된다. 가변 템플릿은 템플릿의 매개 변수로 여러 개의 인자를 받을 수 있도록 하는 기능이다.

 

이는 함수나 클래스 템플릿을 정의할 때, 인자의 개수가 동적으로 변할 수 있을 때 유용하게 사용된다.

 

이때, 인자의 갯수는 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++ > Modern C++(11, 14, 17, 20)' 카테고리의 다른 글

[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

관련글 더보기