템플릿 사용목적 : 간단하게 말해서 범용성을 높이기 위한것이다.
*클래스 템플릿 : 전용 가능한 저장 컨테이너 작성에 유리하다.
예)
만약 int와 char를 멤버로 가지는 클래스와 float,int를 멤버로 가지는 클래스를 선언해보자.
class Ci_c_pair{
public:
int first;
char second;
}
와...
class Cf_i_pair{
public:
float first;
int second;
}
이렇게 구성될 수 밖에 없을 것이다.. 이것을 템플릿으로 구성해보자.
template <typename T1, typename T2>
class pair{
public:
T1 first;
T2 second;
}
이렇게 선언하면 된다. 생성 호출은?
pair<int, char> pair1(1,'n');
pair<float, int> pair2(1.2,2);
이런식으로 생성하면 된다. 편하다. ㅋ
그리고 template로 멤버함수를 구성한다면.. 레퍼런스를 사용하자.
즉... 멤버함수가 method(T1 a, T2 b)로 하면 개체를 복사하여야하므로
method(T1& a, T2& b)로 하여 사용하면 주소만 넘어가므로 시간도 적게걸리고 가볍다.
*함수템플릿 : 알고리즘 정의할 때 좋다
예)
int max(int a, int b){
if(a>b) return a;
else return b;
}
double max(double a, double b){
if(a>b) return a;
else return b;
}
....
이렇게 비슷한함수 여러번 쓸바에는 차라리 템플릿을 쓰자
template <typename T>
T max(T a, T b){
if(a>b) return a;
else return b;
}
이렇게 선언해놓으면 그냥 쓰면된다.. 편하지 아니한가?
단... 여기서 연산자 비교등이 이루어지게 된다면... 연산자 오버로딩을 해주어야한다.
이유는 다름이 아니라 컴파일러가 이 타입이 무엇인지 추측할 수 있도록 해주어야한다.
*멤버함수 템플릿
템플릿 클래스가 아닌 클래스의 멤버도 템플릿클래스 인자를 받아올 수 있다.
*STL의 vector클래스의 insert 멤버함수
template <typename T>
class vector{
...
public:
template <typename InputIterator>
void insert( 벡터반복자타입 pos,
InputIterator first,InputIterator end); //InputIterator를 사용하는것은 좀 더 제네릭한 사용을 위해서이다. (굳이 형식을 지정하지않고 템플릿으로 해야 멤버함수가 더 유연성을 지닌다.)
*템플릿인자 지정하기
Container사용하여 템플릿 지정하기
template <typename Container>
Container make(const char s[]){
return Container(&s[0], &s[strlen(s)]);
}
이렇게 make라는 것을 지정해두면 문자열을 원하는 타입에 맞추어 생성해 줄 수 있다.
다음처럼...
list<char> L = make("Hello, world!");
단, 이경우 Container가 어떠한 형식으로 저장되어야할지 생각해보자....
그냥.. 랜덤저장 될수 있을것이다....... 라고 생각하지 마라-_-;
컴파일이 안되고 에러가 난다...뭘로 저장할지 지정해 줄 방법이 없으니까.
따라서 이경우 어떠한 형식으로 생성될 것인지 지정해주어야한다.
list<char> L = make< vector<char>>("Hello, world!");
이렇게 지정을 해주어야한다.
*default template 인자.
template 는 인자의 타입을 어떻게 가질지 지정해주어야한다.
template <typename T>는... template<typename T, typename Allocator=allocator<t>>
이렇게 쓰여있다는 것이다. T만 넘겨주면 된다. 뒤에 allocator<어쩌고>는 생략하고..
반응형
댓글