가변 인자 각각에 대한 반복 작업 수행하기




어떤 함수에 가변 인자 템플릿 문법을 통해

임의의 개수의 인자를 전달할 경우
각 인자들에 대하여 반복적인(재귀) 작업을 수행하는 문법


가변인자 템플릿 재귀 방법

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
}

 

 
 
 
 
Posted by Elan
: