[C++] template, 템플릿 사용 예제 – 1. 함수 템플릿, 특수화

template는 매개변수의 타입에 따라 함수나 클래스를 생성하는 C++의 일반화 프로그래밍의 메커니즘입니다.
template를 사용하면 같은 작업, 다른 매개변수에 따라 동작하는 함수나 클래스를 한번에 정의할 수 있습니다.

함수 템플릿은 다음과 같은 방식으로 사용합니다.

// 일반적임 함수 템플릿
template <typename T>
// 함수
{
	// 본체
}

typename키워드 대신 class 키워드를 사용하셔도 됩니다.(C++ 98 부터 typename 키워드 추가됨)

아래 예제는 두개의 매개 변수의 합을 표시하는 Sum 함수를 template로 작성한 것입니다.

template <typename T>
T Sum( T A, T B )
{
	T C = A + B;

	cout << "Sum : " << C << endl;
	return C;
}

int main()
{
	// 일반적임 함수 템플릿
	float fA = 4.3f, fB = 6.2f;
	Sum<float>( fA, fB );

	short sA = 4, sB = 1;
	Sum<short>( sA, sB );
	cout << endl;
    
    return 0;
}

위 함수를 실행하면 아래와 같이 출력됩니다.

Sum : 10.5
Sum : 5

템플릿의 경우 특정 매개변수 타입으로 재정의를 하고 싶을 때, 아래와 같이 코딩하면 됩니다.
Sum함수에서 char*에 대한 매개변수 타입에 대해 특별한 동작을 정의한 예제입니다.

template <>
char* Sum<char*> ( char* s1, char* s2 )
{
	char* str = "[char*] template";

	cout << s1 << " " << s2 << endl;

	return str;
}

위와 같은 템플릿 정의를 템플릿 명시적 특수화(template explicit specialization) 이라 합니다.

전체 코드는 아래와 같습니다.

#include <iostream>
using namespace std;

// 일반적임 함수 템플릿
// class, typename 둘다 사용 가능
//template <typename T>
template <typename T>
T Sum( T A, T B )
{
	T C = A + B;

	cout << "Sum : " << C << endl;

	return C;
}

// template 특수화 : 재정의 하고싶을때
template <>
char* Sum<char*> ( char* s1, char* s2 )
{
	char* str = "[char*] template";

	cout << s1 << " " << s2 << endl;

	return str;
}

int main()
{
	// 일반적임 함수 템플릿
	float fA = 4.3f, fB = 6.2f;
	Sum<float>( fA, fB );

	short sA = 4, sB = 1;
	Sum<short>( sA, sB );
	cout << endl;

	// template 특수화 : 재정의 하고싶을때
	char *s1 = "hellow C++";
	char *s2 = "world";
	Sum<char *>( s1, s2 );
	cout << endl;

	return 0;
}
출력 결과
Sum : 10.5
Sum : 5

hellow C++ world