#include <iostream>
using namespace std;
// 템플릿 기초
// 매우 어렵다, C++의 흑마법
/*
* 같은 내용의 반복이지만 매개변수의 차이로 계속 오버로딩 하는건 무리가 있음
void Print(int a) {
cout << a << endl;
}
void Print(float a) {
cout << a << endl;
}
void Print(double a) {
cout << a << endl;
}
void Print(const char* a) {
cout << a << endl;
}
*/
class Knight{
public:
public:
int _hp = 100;
};
template<typename T>
//template<class T>
void Print(T a) {
cout << a << endl;
}
template<typename T>
int Add(T a, T b) {
return a + b;
}
template<typename T1,typename T2>
void Print(T1 a, T2 b)
{
cout << a << " " << b << endl;
}
/*
//cout에 대한 연산자 오버로딩을 통해
//cout에 knight포인터가 들어와도 처리될 수 있게 만듦
ostream& operator<<(ostream& os, const Knight& k) {
os << k._hp;
return os;
}
*/
// 템플릿 특수화
// 특정 템플릿의 처리를 다르게 하고 싶을 경우 사용
template<>
void Print(Knight a) {
cout << "Kinght!! "<< a._hp << endl;
}
int main()
{
// 템플릿 : 함수나 클래스를 찍어내는 틀
// 1) 함수 템플릿
// 2) 클래스 템플릿
// 어셈블리어를 보면 사실 함수가 각기 다르게 만들어진 것이다.
// 컴파일러가 알아서 치환해준다
Print<int>(50.0f); //명시적 템플릿 지정
Print(50.1f);
Print(50.12f);
Print("A");
Add(1.0f , 1.5f);
Add<int>(1, 2);
Print("내 나이는", 1);
Knight k1;
Print(k1);
return 0;
}