1. 템플릿
함수나 클래스를 찍어내는 틀.
함수 템플릿과 클래스 템플릿이 있다.
2. 함수 템플릿
(1) 정의
숫자를 출력하는 함수를 만든다.
void Print(int a)
{
cout << a << endl;
}
int main()
{
Print(50);
}
여기서 Print 함수는 int 형으로만 출력이 가능하다.
물론 이를 함수 오버로딩을 이용하여 float 형이나 double 형 등등으로 만들 수 있지만 매개 변수 부분만 다르게 설정할 수 있도록 하면 더 편할 것 같다.
이 때 템플릿을 활용할 수 있다.
template<typename T>
void Print(T a)
{
cout << a << endl;
}
함수를 main 함수 내에서 호출할 때마다 컴파일러가 형식을 결정한다.
단, 명시적으로 형식을 결정해 줄 수 있다.
int main()
{
Print(50);
Print<int>(50.0f); // 명시적으로 호출
}
(2) 함수 자체의 타입도 바꾸기
template<typename T>
T Add(T a, T b)
{
return a + b;
}
(3) 매개 변수를 여러개 쓰는 템플릿
template<typename T1, typename T2>
void Print(T1 a, T2 b)
{
cout << a << " " << b << endl;
}
int main()
{
Print(50);
Print<int>(50.0f); // 명시적으로 호출
Print(10, 20);
}
3. 템플릿 특수화
class Knight
{
public:
public:
int _hp = 100;
};
int main()
{
Print(k1); // 오류 발생
}
오류를 확인하면 cout << 에서 오류가 발생한 것을 알 수 있다.
따라서 연산자 오버로딩을 해본다.
ostream& operator<<(ostream& os, const Knight& k)
{
os << k._hp;
return os;
}
int main()
{
Knight k1;
Print(k1);
}
이번엔 연산자 오버로딩 없이 작동하는 방법을 알아본다.
클래스만 예외적으로 작동하는 것 처럼 예외로 만드는 것을 템플릿 특수화라고 한다.
template<>
void Print(Knight a)
{
cout << a._hp << endl;
}
'기초 C++ 스터디 > 객체지향' 카테고리의 다른 글
8-6. 콜백(Callback) 함수 (0) | 2023.06.08 |
---|---|
8-5. 템플릿 기초(2) - 클래스 템플릿 (0) | 2023.06.08 |
8-3. 함수 객체(Functor) (0) | 2023.06.08 |
8-2. 함수 포인터(2) (0) | 2023.06.08 |
8-1. 함수 포인터(1) (0) | 2023.06.08 |