C++ Chapter 13.4 : 함수 템플릿 특수화

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 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 파일에 따로 정의하면 특수화가 되지 않는다.
      • 특수화도 아직 틀일 뿐이지 구체화된건 아니기 때문.
    • 그냥 특수화도 헤더 파일안에 같이 해주는 것을 권장한다.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

댓글남기기