함수나 클래스를 찍어내는 틀. 함수 템플릿과 클래스 템플릿이 있다.
template<typename T>
template<class T> // 둘다 사용 가능함
함수 템플릿
template<typename T>
void Print(T a) { // do something }
Print(50); // 암시적
Print<int>(50); // 명시적
인자가 2개인 경우도 사용 가능하다.
template<typename T1, typename T2>
void Print(T1 a, T2 b)
{
// do something
}
템플릿 특수화
특정 타입에 대해서만 다른 규칙을 따르도록 하고 싶을 때 사용한다 (예외 적용)
template<typename T>
void Print(T a)
{
// do something
}
template<>
void Print(Knight a)
{
// do something
}
클래스 템플릿
template<typename T>
class RandomBox
{
public:
T GetRandomData()
{
int idx = rand() % 10;
return _data[idx];
}
public:
T _data[10];
};
무조건 typename만 붙여줘야 하는 것은 아니다.
template<typename T, int SIZE = 10> // 기본값 설정 가능
class RandomBox
{
public:
T GetRandomData()
{
int idx = rand() % SIZE;
return _data[idx];
}
public:
T _data[SIZE];
};
단, 템플릿 인자가 다른 경우 서로 별개의 클래스로 보기때문에 클래스 이름이 같아보여도 다형성이 성립하지 않는다.
인자까지 같아야만 같은 클래스로 인식한다.
RandomBox<int, 10> rb1;
RandomBox<int, 20> rb2;
rb1 = rb2 // 불가능!
템플릿 특수화
template<int SIZE = 10>
class RandomBox<double, SIZE>
{
public:
double GetRandomData()
{
int idx = rand() % SIZE;
return _data[idx];
}
public:
double _data[SIZE];
};
함수는 오버로딩이 지원되기 때문에 이름이 같아도 상관 없었지만 클래스는 그렇지 않기때문에 템플릿 특수화 라는것을 명시하기 위해 클래스명에 추가로 명시를 한다.
'C++ > Rookiss C++' 카테고리의 다른 글
[STL] vector (0) | 2022.08.30 |
---|---|
[콜백 함수] 콜백 함수 (0) | 2022.08.30 |
[콜백 함수] 함수 객체 (0) | 2022.08.30 |
[콜백 함수] 함수 포인터 (0) | 2022.08.30 |
[디버깅] (0) | 2022.08.30 |