SW/C++

C++ : 가변 인자 템플릿 : 장점, 사용법, 예제, 개념

얇은생각 2020. 4. 19. 07:30
반응형

 

가변인자 템플릿

printf() 함수는 몇개의 매개 변수든 받을 수 있습니다. 템플릿 프로그램ㅇ에서도 똑같이 할 수 있습니다. 이것을 가변 인자 템플릿이라고 합니다.

다양한 매개변수 개수와 자료형을 지원하는 클래스 또는 함수 템플릿을 의미합니다. 매개 변수 목록에서 생략 부호(...)를 씁니다.

 

 

가변 인자 템플릿 클래스

template<typename ... Arguments>
<반환형> <함수명>(Arguments... args)
{
}

 

 

 

std::make_unique()

가변 인자 템플릿을 사용하는 대표적인 클래스는 바로 make_unique() 함수입니다. 매개변수가 얼마나 많이 나오는 지에 대해 알 수 없기 때문에, 활용되다는 것을 알 수 있습니다. 

또 추가적으로 share_ptr에서도 활용되고 있다는 것을 알 수 있습니다.

 

 

 

가변 인자 템플릿 활용

활용법을 생각하기가 정말로 어렵습니다. 주로 인자 전달용입니다. 몇몇 다른 아이디어들도 있지만, 실용적이기는 어렵습니다. 

 

 

 

예제

#pragma once

#include <iostream>

using namespace std;

namespace samples
{
	void VariadicTemplateFunctionExample();

	template<typename T, typename... TArgs>
	T* Create(TArgs... args)
	{
		cout << "Creating instance" << endl;
		T* object = new T(args...);
		return object;
	}
}

 

#include "VariadicTemplateFunctionExample.h"
#include "Foo.h"
#include "Bar.h"

namespace samples
{
	void VariadicTemplateFunctionExample()
	{
		Foo* foo1 = Create<Foo>(1.0f);
		Foo* foo2 = Create<Foo>(1.0f, 2.0f);
		
		// Compile error
		// Foo* foo3 = Create<Foo>(1.0f, 2.0f, 3.0f);

		Bar* bar1 = Create<Bar>();
		Bar* bar2 = Create<Bar>(1, 2, 3);

		// Compile error
		// Bar* bar3 = Create<Bar>(1, 2);

		delete foo1;
		delete foo2;

		delete bar1;
		delete bar2;
	}
}

 

좋은 예제가 아래 사이트에 공유되어 있습니다. 해당 방식으로 가변 인자 템플릿을 활용할 수 있습니다.

 

https://github.com/POCU/COMP3200CodeSamples/tree/master/13

 

POCU/COMP3200CodeSamples

Code samples for COMP3200. Contribute to POCU/COMP3200CodeSamples development by creating an account on GitHub.

github.com

반응형