공부/C || C++

C++ 템플릿 특수화

sudo 2021. 7. 24. 02:01

C++에서 클래스나 함수를 템플릿으로 선언했을 때, 내가 원하는 타입에 대해서만 따로 특별하게 구현할 수 있는 기능을 제공하는데 이를 템플릿 특수화라고 한다.

 

예를 들어서 아래와 같이 템플릿으로 함수를 구현했다고 가정하자.

template<typename T>
void Output(T t1, T t2)
{
	std::cout << t1 + t2 << std::endl;
}

template<>
void Output(float f1, float f2)
{
	std::cout << "Float Sum: ";
	std::cout << f1 + f2 << std::endl;
}


int main()
{
	Output<int>(3,4);	// 1번

	Output<float>(3.14f, 5.22f);	// 2번

	return 0;
}

1번은 첫번째 템플릿 함수인 Output(T t1, T t2) 함수를 호출하지만, 2번은 두번째 템플릿 특수화 함수를 호출한다. float 타입에 대해서만 다른 동작을 하도록 구현되어 있다. 여기서 템플릿 특수화를 하기 위해서 조건이 있다.

1. template<>를 반환형 앞에 써줘야 한다.

2. 반환타입이 같아야 한다.

3. 인자 개수가 같아야 한다.

 

클래스 템플릿에 대해서는 아래와 같이 부분적으로 특수화를 할 수 있다.

template <typename T, int Size> // int Size = 99; 이렇게 디폴트 인자로 줄 수도 있음
class CTemplate
{
public:
	CTemplate()
	{
		std::cout << typeid(T).name() << std::endl;
		std::cout << "Size: " << size << std::endl;
	}

	~CTemplate()
	{

	}

private:
	T m_T1;
	T m_T2;
};

단 주의해야 할 점은 CTemplate 클래스의 객체를 생성하면서 T 타입, int 타입의 Size을 인자로 줄 때 Size인자는 무조건 상수로 줘야한다. 이때 Size인자를 '비타입인자'라고 한다.

	int tmp1 = 4;

	CTemplate<int, 100> temp1;
	CTemplate<float, 400> temp2;
	// CTemplate<float, tmp1> temp3; error