클래스 템플릿 정의
클래스 정의 위에
template <typename T>
template <class T>
둘 중 하나를 붙여 템플릿을 정의한다.
템플릿은 인스턴스화 되기 전까지는 컴파일 시에 아무런 코드로 변환되지 않는다.
= 템플릿은 컴파일 시에 인스턴스화 된다.
템플릿 특수화
template <typename T>
class Vector {
T* data;
int capacity;
int length;
}
// 템플릿 특수화 bool을 템플릿 인자로 전달하는 경우
template <>
class Vector <bool>{
unsigned int* data; // bool* data로 쓰게 되면 원소 하나당 1byte씩 쓰기 때문에 1bit로 표현하기 위함이다.
int capacity;
int length;
}
함수 템플릿
template <typename T>
T max(T& a, T& b) {
return a > b ? a : b;
}
int main(void){
int a = 3;
int b = 5;
cout << max(a, b); // C++ 컴파일러가 max<int>(a, b)로 인식하여 처리해줌
}
함수 객체(Functor)
ㄴ 함수는 아니지만 operator()를 내부에 구현하여 함수인척 하는 객체
ㄴ sort 함수에 템플릿 인자로 넣어 오름차순, 내림차순을 설정할때 사용하기도 한다.
타입이 아닌 템플릿 인자
template <typename T, int num>
T add_num(T t) {
return t + num;
}
템플릿 인자로 전달할 수 있는 타입들은 제한적이다.
ㄴ 정수 타입, (float, double) 제외
ㄴ 포인터 타입
ㄴ enum 타입
ㄴ 널포인터 (std::nullptr_t)
예시) 함수를 배열을 전달할 때 배열의 크기를 잃어버린다는 문제가 있었는데, C++11의 std::array를 사용하여 배열을 생성할 경우 템플릿 인자로 배열의 크기를 명시할 수 있게 되었다.
std::array<int, 5> arr = {1, 2, 3, 4, 5};
// arr.size()로 배열 크기에 대한 정보 획득 가능
디폴트 템플릿 인자
template <typename T>
struct Compare {
bool operator()(const T& a, const T& b) const { return a < b; }
};
template <typename T, typename Comp = Compare<T>>
T Min(T a, T b) {
Comp comp;
if (comp(a, b)) {
return a;
}
return b;
}
// Min함수 템플릿은 피연산자로 정수가 오든 문자열이 오든 처리가 가능하다
참조:
'C++' 카테고리의 다른 글
C++ RAII와 스마트포인터 (0) | 2022.08.26 |
---|---|
C++ 가상 함수, virtual 소멸자, 가상 함수 테이블, 추상 클래스 (0) | 2022.08.25 |
C++ r-value 참조와 move, 이동 생성자 (0) | 2022.08.25 |
C++ 문자열 처리 (0) | 2022.08.24 |
C++ memory order, atomic객체 (0) | 2022.08.24 |