템플릿 기초

이승덱·2021년 7월 21일

CPP

목록 보기
44/70
#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;

}
profile
공부 기록용 블로그입니다

0개의 댓글