가변 인자 템플릿은 가변 인자 함수와 마찬가지로 인수로 몇개가 올지 모르는 템플릿이다.
몇개의 키보드 입력을 받을지 모르는 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> 템플릿을 실행한다.
'C++' 카테고리의 다른 글
| [C++] 스마트 포인터, unique_ptr (0) | 2022.02.18 |
|---|---|
| [C++] 파일 입출력 - fopen_s, fread, fwrite (0) | 2022.01.25 |
| [C++] vector, list, map에 할당한 메모리 해제 (0) | 2022.01.20 |
| [C++] 상속관계에서 복사 생성자 호출 (0) | 2022.01.18 |
| [C++] const string&을 쓰는 이유(const와 레퍼런스) (0) | 2022.01.18 |