template <typename T> 이 부분이 템플릿 파라미터를 정의하는 부분이다.template<typename T>
void print(T a)
{
cout << a << endl;
}
template<typename T1, typename T2>
void print(T1 a, T2 b)
{
cout << a << " " << b << endl;
}
template<typename T>
void print(int a)
{
cout << "(int)" << a << endl;
}
int main()
{
print<int>(1);
print<float>(3.14f);
print<const char*>("Hello");
print<int, const char*>(1, "Hello");
}
std::vector, std::list 등이 모두 클래스 템플릿입니다.// 선언을 따로 안하면 기본 타입으로 int를 사용하겠다는 뜻, 뒤의 값도 동일
template<typename T = int, int SIZE = 200>
class RandomBox
{
public:
T GetRandomData()
{
int index = rand() % SIZE;
return data[index];
}
public:
T data[SIZE];
};
// 완전 특수화 때문에 <>안을 명시적으로 제거한다.
template<>
class RandomBox<float>
{
public:
float GetRandomData()
{
int index = rand() % 100;
return data[index];
}
public:
float data[100];
};
int main()
{
RandomBox<int, 100> r1;
RandomBox<float> r2;
}
일반 템플릿
템플릿은 모든 타입과 크기에 대해 일반적인 형태를 정의합니다.
완전 특수화
특정 타입(float)에 대해 별도의 완전한 정의를 제공합니다.
template<>를 사용하여 일반 템플릿과의 연결을 명시적으로 제거합니다.
부분 특수화
템플릿의 일부 매개변수를 특정 값으로 고정하거나 일부를 변경할 때 사용됩니다.
부분 특수화는 클래스 템플릿에만 사용할 수 있습니다.