본문 바로가기

Programming/CPP11&14

[C++11] 가변인자 템플릿을 위한 sizeof... 연산자

반응형

가변인자 템플릿의 지원으로 템플릿을 작성하는 것이 더 편리하게 되었습니다.

C++11의 가변인자  템플릿에 대한 설명은 아래 링크를 통해서 참조할 수 있습니다.

2015/03/05 - [Programming/C++11&14] - [C++11] 가변인자 템플릿(Variadic Templates)

가변인자 템플릿이 추가되면서 sizeof...연산자가 추가되었습니다.

sizeof...은 기존의 sizeof와는 약간 다른 기능을 합니다.

sizeof...은 파라미터 팩의 수를 가져오는 역할을 합니다.

가변인자로 넘어온 파라미터를 파라미터 팩이라고 하는데 ...이 실제 몇 개의 인자인가 알 수 있습니다.

이전 가변인자 템플릿의 예제를 가져와서 조금 수정해 보도록 하겠습니다.

#include <iostream>

using namespace std;

void print()
{
	cout << endl;
}

/*
template <typename T> void print(const T& t)
{
	cout << t << endl;
}
*/

template <typename First, typename... Rest> void print(const First& first, const Rest&... rest)
{
	if (0 <= sizeof...(rest))
	{
		cout << first << " ";
		print(rest...); // recursive call using pack expansion syntax
	}
	else
	{
		print();
	}
}

int main()
{
	print(); // calls first overload, outputting only a newline
	print(1); // calls second overload

	// these call the third overload, the variadic template, 
	// which uses recursion as needed.
	print(10, 20);
	print(100, 200, 300);
	print("first", 2, "third", 3.14159);
}

기존에 있던 print(const T& t)를 제거하고 가변인자 템플릿 함수의 내부를 수정했습니다.

sizeof... 연산자가 현재 몇 개가 파라미터 팩(rest)에 존재하는지 알려주게 됩니다.

그래서 따로 1개만 전달받는 특수화된 템플릿 함수가 없이도 파라미터 팩 확장을 종료시킬 수 있습니다.

sizeof... 연산자를 활용해서 가변인자 템플릿을 좀 더 유연하게 사용할 수 있게 됩니다.

반응형