템플릿은 C++에서 코드의 재사용성을 높이고, 다양한 데이터 타입에 대해 유연하게 동작할 수 있게 해준다. 특히, 동일한 알고리즘을 다양한 타입에 적용할 때 유용하다.
템플릿을 사용하면 코드의 중복을 줄이고, 타입에 독립적인 코드를 작성할 수 있다. 이를 통해 유지보수성이 향상되고, 코드의 가독성도 높아진다.
함수 템플릿은 데이터 타입에 상관없이 하나의 함수 정의로 여러 타입에 대해 작업을 수행할 수 있게 한다.
함수 템플릿은 template<typename T> 혹은 template<class T>로 시작하며, T는 임의의 타입을 의미한다.
template<typename T>
T add(T a, T b) {
return a + b;
}
특정 타입에 대해 일반 템플릿과 다르게 동작하도록 특수화할 수 있다.
template<>
int add(int a, int b) {
// int 타입에 대한 특수한 구현
return a + b + 10;
}
클래스 템플릿은 데이터 타입에 상관없이 동일한 클래스 정의를 다양한 타입에 대해 사용할 수 있게 한다.
template<typename T>
class Container {
T element;
public:
Container(T arg) : element(arg) {}
T getElement() { return element; }
};
특정 타입에 대해 클래스 템플릿을 특수화할 수 다.
template<>
class Container<int> {
int element;
public:
Container(int arg) : element(arg) {}
int getElement() { return element * 2; }
}
특정 조건을 만족하는 타입에 대해 부분적으로 특수화할 수 있다.
template<typename T>
class Container<T*> {
T* element;
public:
Container(T* arg) : element(arg) {}
T* getElement() { return element; }
}
템플릿은 타입뿐만 아니라, 값, 포인터, 참조 등을 매개변수로 받을 수 있다.
template<typename T, int size>
class Array {
T arr[size];
public:
T& operator[](int index) { return arr[index]; }
}
템플릿 매개변수에 디폴트 값을 지정할 수 있다.
template<typename T = int>
class DefaultContainer {
T element;
public:
DefaultContainer(T arg = 0) : element(arg) {}
T getElement() { return element; }
}
이와 같은 방식으로 템플릿을 활용하면, 다양한 데이터 타입에 대해 유연하고 재사용 가능한 코드를 작성할 수 있다.