#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;
}