13.4 함수 템플릿 특수화
#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 << "Warning : comparing chars" << "\n";
return (x > y) ? x : y;
}
int main()
{
// cout << getMax(1, 2) << "\n"; // 자동으로 getMax<int> 이런 식으로 자동으로 인스턴시에이션을 해주고 있는 것.
cout << getMax('a', 'b') << "\n"; // 문자열이 들어왔을 경우 경고문을 띄우고 싶다. 이럴 경우 특수화를 한다.
return 0;
}
멤버 함수에 대한 특수화
#pragma once
#include <iostream>
template <class T>
class Storage
{
private:
T m_value;
public:
Storage(T value)
{
m_value = value;
}
~Storage()
{
}
void print()
{
std::cout << m_value << "\n";
}
};
//double 타입에 대해 특수화
// 이 부분을 cpp 파일에 옮기게 되면 작동하지 않는다. 메인 파일에서 이 특수화 된 것을 모르기 때문이다. 그래서 보통 헤더에 적거나 main cpp에 cpp 파일을 include 시키면 된다. 그럼 컴파일러가 cpp 파일에 있는 함수를 읽어서 특수화가 작동하게 된다.
template<>
void Storage<double>::print()
{
std::cout << "Double Type ";
std::cout << std::scientific << m_value << "\n";
}
#include <iostream>
#include "Storage.h"
using namespace std;
int main()
{
Storage<int> nValue(5);
Storage<double> dValue(6.7);
nValue.print();
dValue.print();
return 0;
}