Variadic Template 가변인자 템플릿의 Recursive call 문법
C++/C++ 2022. 3. 11. 18:11 |가변 인자 각각에 대한 반복 작업 수행하기
어떤 함수에 가변 인자 템플릿 문법을 통해
임의의 개수의 인자를 전달할 경우
각 인자들에 대하여 반복적인(재귀) 작업을 수행하는 문법
가변인자 템플릿 재귀 방법
class PaymentSystem
{
public:
// ...
template<typename... Handler>
void SetChain(Handler*... _handler)
{ // handlers의 원소들을 모두 제거하고, 각 가변 인자들을 vector 컨테이너에 삽입하는 함수
while (handlers.empty() == false)
handlers.pop_back();
(handlers.push_back(_handler), ...); // 각 인자에 대하여 반복 수행하기
}
std::vector<Handler*> handlers;
};
PaymentSystem* ps = new PaymentSystem;
CashHandler* cash = new CashHandler;
CreditCardHandler* credit = new CreditCardHandler;
DebitCardHandler* debit = new DebitCardHandler;
ps->SetChain(cash, credit, debit);
템플릿 특수화를 통한 재귀
// 템플릿 특수화(specialization)를 이용하여 인자가 하나밖에 없을 땐 이 함수를 호출한다
template<typename T>
void PrintVarArgs(T&& arg)
{
std::cout << arg << '\n';
}
// 2개 이상의 인자가 있을 경우에는 이 함수가 호출된다
template<typename T, typename... Args>
void PrintVarArgs(T&& firstArg, Args&&... args)
{
std::cout << std::forward<T>(firstArg)<<", "; // 첫번째 인자를 출력
/* 인자가 2개 이상일 경우 recursive call
인자가 1개 밖에 없는 경우 맨위의 특수화된 함수를 호출하므로써 재귀 종료 */
PrintVarArgs(std::forward<Args>(args)...);
}
int main()
{
/* 2번째 템플릿 함수가 계속 재귀 호출 되다가
마지막 인자 m 하나만 남았을 때, 첫번째 템플릿 함수가 호출된다*/
PrintVarArgs(3, 5,3.1f,"Test",'m'); // 출력 : 3, 5, 3.1, Test, m
}
'C++ > C++' 카테고리의 다른 글
std::hash - built-in타입이 아닌 경우 직접 정의해보기 (0) | 2022.08.09 |
---|---|
[메모리] 메모리 프로파일링 (0) | 2022.04.06 |
멤버 함수 포인터(Member Function Pointer) (0) | 2022.02.11 |
(작성 중) Scoped static 과 Singleton (0) | 2022.02.02 |
MSVC++ Tips (0) | 2022.01.22 |