[C++ Programming] Chapters 12 : 템플릿 Template
🏫Chapters 12 : 템플릿 Template
템플릿
-
같은 동작을 하지만 타입을 여러개 받을 수 있도록 만드는 틀
-
template <class T>
: T에 대해 컴파일러에게 사전에 알려주기 위해 명시. -
예시
template<class T>
class mypair{
T a, b;
public:
mypair(T first, T second){
a = first;
b = second;
}
T getmax();
}
template<class T>
T mypair<T>::getmax(){
T ret;
ret = a > b ? a : b;
return ret;
}
int main(void){
mypair <int> myobj(100, 75);
mypair <float> myobj2(75.2, 100.004);
cout<< myobj.getmax();
cout<< myobj2.getmax();
return 0;
}
//return 값 : 100
- 위에서 만약 T에 Point클래스가 들어간다면? getMax함수가 Point에 대해서도 작동하게 할 수 있을까?
- 원칙적으로 프리미티브 타입이나 사용자 정의 타입 모두 넣을 수 있다. 그러나 모든 타입에 대해 제대로 작동하는 것은 아니다. 올바르게 동작하기 위해서는 함수의 구현에서 요구하는 오퍼레이터나 함수를 지원해주어야한다. 어떤 것을 지원해야 하는지는 매뉴얼에 나와있다.
-
벡터 템플릿같은 경우에는 요구하는 것이 따로 없다. 벡터는 대입밖에 안하기 때문에 컴파일러가 대입연산자를 디폴트로 만들어준다.
- 따라서 원칙적으로는 모든 타입에 대해 템플릿을 사용할 수 있기 때문에 제대로 지원만 해준다면 유용하게 사용할 수 있다.
- EX2
#include<iostream>
using namespace std;
template<class T, int N>
class mysequence
{
public:
void setmember(int x, T value);
T getmember(int x);
private:
T memblock[N];
};
template<class T, int N>
void mysequence<T, N>::setmember(int x, T value) {
memblock[x] = value;
}
template<class T, int N>
T mysequence<T, N>::getmember(int x) {
return memblock[x];
}
int main(void) {
mysequence<int, 5> myint;
mysequence<double, 5> myflo;
myint.setmember(0, 100);
myflo.setmember(3, 3.14);
cout << myint.getmember(0) << endl;
cout << myflo.getmember(3) << endl;
return 0;
}