본문 바로가기

C++

[C++] 가변 인자 템플릿 (variadic template)

가변 인자 템플릿은 가변 인자 함수와 마찬가지로 인수로 몇개가 올지 모르는 템플릿이다.

몇개의 키보드 입력을 받을지 모르는 AddKey로 가변 인자 템플릿을 만들어보겠다.

 

template<typename T>
	bool AddKey(const T& data)
	{		
		if (!m_pCreateKey)
			m_pCreateKey = new KEYINFO;

		const char* pTType = typeid(T).name();

		if (strcmp(pTType, "char") == 0 ||
			strcmp(pTType, "int") == 0)
		{
			m_pCreateKey->vecKey.push_back((DWORD)data);
		}
		else
		{
			m_pCreateKey->strName = data;
			m_mapKey.insert(make_pair(m_pCreateKey->strName, m_pCreateKey));
		}
		return true;
	}

	template<typename T, typename... Types>
	bool AddKey(const T& data, const Types&... arg)
	{
		if (!m_pCreateKey)
			m_pCreateKey = new KEYINFO;

		const char* pTType = typeid(T).name();

		if (strcmp(pTType, "char") == 0 ||
			strcmp(pTType, "int") == 0)
		{
			m_pCreateKey->vecKey.push_back((DWORD)data);
		}
		else
		{
			m_pCreateKey->strName = data;
			m_mapKey.insert(make_pair(m_pCreateKey->strName, m_pCreateKey));
		}
		AddKey(arg...);

		if (m_pCreateKey)
			m_pCreateKey = NULL;

		return true;
	}

 

먼저 기본형의 템플릿이 작성된 다음 가변 인자 템플릿이 작성되는데 위 코드에서는 인수가 두개 이상일 경우 가변 인자 템플릿의 코드가 실행된다.

 

	template<typename T, typename... Types>
	bool AddKey(const T& data, const Types&... arg)

 

가변 인자 템플릿의 형식이다. 맨 처음에는 첫번째 인수가 const T& data이며 나머지 인수들은 arg에 저장된다. 그래서 첫번째 인수에 대한 코드가 끝나면 AddKey(arg...) 로 재귀호출해서 그 다음 인수에 대한 명령들을 실행한다. 그리고 마지막 인수에 대해서는 인수가 하나인 것과 같기 때문에 초기 기본형의 template<typename T> 템플릿을 실행한다.