※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로
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;
}
ㆍ 버전이 많아질수록 힘들겠다.....
template<typename T>
void Print(T a)
{
cout << a << endl;
}
ㆍ 이 타입 자체가 정해지진 않았지만... 뭐든받겠다!
ㆍ 함수의 틀을 만들어준거고 사용하는 순간 컴파일러가 만들어준다.
int main()
{
Print(50);
Print(50.1f);
Print(50.2);
Print("hi");
Print<int>(50);
// 형식을 지정해 줄 수도 있다.
}
ㆍ 들어간 자료형에 따라 컴파일러가 자동으로 정해주며, 직접적으로 형식을 지정해 줄 수도 있다.
template<typename T>
T Add(T a, T b)
{
return a + b;
}
ㆍ 반환타입도 임시인 T로 받을 수 있다.
template<typename T1, typename T2>
void Print(T1 a, T2 b)
{
cout << a << " " << b << endl;
}
ㆍ int, char* 등등 여러가지 자료형을 받는 버전도 만들 수 있다.
★ 근데 자료형의 자리에 클래스가 들어갔다면??
class Knight
{
public:
public:
int _hp = 12200;
};
ㆍ 이거 그냥 아무거도 안하고 템플릿에 때려박으면 오류난다...
ㆍ 클래스의 경우엔 "<<"연산자를 지원을 안하기때문에 오류가 날 것이다.
ㆍ 사용하던 cout을 타고 들어가면 ostream 이라는게 있다. 이걸 활용해서 연산자 오버로딩을 하자
ostream& operator<<(ostream& os, const Knight& k)
{
os << k._hp;
return os;
}
정말 다 정의해줘야 하는구나..
▶ 템플릿 특수화?
ㆍ 특정 타입에 대해서만 다르게 동작하게 하고싶을 때 사용한다.
ㆍ 기사일 경우에만 다르게 사용하고 싶다면?
template<>
void Print(Knight a)
{
cout << "나이트!!!!!!!!!!" << endl;
cout << a._hp << endl;
}
그럼 나이트의 경우에만 얘가 실행된다.
int main()
{
Print(50);
Print(50.1f);
Print(50.2);
Print("hi");
Print<int>(50);
// 형식을 지정해 줄 수도 있다.
int result = Add<float>(5.444f, 5.111f);
//=========
Knight k1;
Print(k1);
}
'C++프로그래밍 > 자료구조,알고리즘(추후확장)' 카테고리의 다른 글
vector의 동작 원리(size / capacity) (0) | 2024.09.28 |
---|---|
콜백함수 (0) | 2024.09.27 |
클래스 템플릿 (0) | 2024.09.27 |
함수객체 (0) | 2024.09.27 |
함수포인터 (0) | 2024.09.26 |