C++ Chapter 13.4 : 함수 템플릿 특수화
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
chapter 13. 템플릿 : 함수 템플릿 특수화
특수화
: 템플릿에서 특정 타입에 대해서 다른 실행 처리를 하고 싶을 때 그 타입에 대해서만 특수화.
🔔 일반 전역 함수의 특수화
#include <iostream>
using namespace std;
template<typename T>
T getMax(T x, T y)
{
return (x > y) ? x : y;
}
int main()
{
cout << getMax(1, 2) << endl;
cout << getMax <double> (1, 2) << endl;
return 0;
}
getMax(1, 2)
👉getMax <int> (1, 2)
나 마찬가지다.getMax <double> (1, 2)
👉 int 인 1 과 2 를 강제로 double로 형변환한다. 1.0, 2.0 으로.
만약 getMax를 <char> 타입으로 구체화 할 때만 예외적으로 경고 메세지를 주고 싶다면?
- if-else문
- 런타임 때 결정되서 안된다.
- if ( T == char ) 같은건 쓸 수 없다.
- 템플릿이 어떤 타입으로 구체화 될 것인가는 런타임이 아닌 컴파일 타임에 결정이 되야 한다. ⭐
- 특정 타입에 대해서만 특수화 하기
#include <iostream>
using namespace std;
template<typename T>
T getMax(T x, T y)
{
return (x > y) ? x : y;
}
template<>
char getMax(char x, char y)
{
cout << "경고! 문자 끼리 비교할 때는 주의 해주세요" << endl;
return (x > y) ? x : y;
}
int main()
{
cout << getMax('a' , 'b') << endl;
return 0;
}
template<>
을 붙인 후 특정 타입에 대해서만 한번 더 정의하면 된다.
- 위와 같이
char
타입에 대해서만 특수화를 해주었기 때문에getMax('a' , 'b')
은getMax <char>('a' , 'b')
나 마찬가지기 때문에 특수하게 “경고! 문자 끼리 비교할 때는 주의 해주세요”가 출력된다.
🔔 멤버 함수의 특수화
클래스 바깥에서 해당 타입에 대해
template<>
을 붙인 후 한번 더 정의해준다.
#include <iostream>
using namespace std;
template<typename T>
class Storage
{
private:
T m_value;
public:
Storage(T value)
{
m_value = value;
}
void print()
{
cout << m_value << endl;
}
};
template<>
void Storage<double>::print()
{
cout << "This is Double Type" << endl;
cout << m_value << endl;
}
int main()
{
Storage<int> nValue(5);
Storage<double> dValue(3.14);
nValue.print();
dValue.print();
return 0;
}
- double 타입인 dValue.print(); 에서만 특수하게 “This is Double Type” 문구가 출력된다.
주의사항
- 이전 포스트에서 언급했던 것처럼
template<> void Storage<double>::print() { cout << "This is Double Type" << endl; cout << m_value << endl; }
- 멤버 함수 특수화 코드를 .cpp 파일에 따로 정의하면 특수화가 되지 않는다.
- 특수화도 아직 틀일 뿐이지 구체화된건 아니기 때문.
- 그냥 특수화도 헤더 파일안에 같이 해주는 것을 권장한다.
- 멤버 함수 특수화 코드를 .cpp 파일에 따로 정의하면 특수화가 되지 않는다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기