본문 바로가기

소프트웨어/C/C++

c/c++] 템플릿

함수템플릿

입력변수,리턴값의 형을 정하지 않고 template라는 약속어를 이용해 정의함

 

template<typename T1,typename T2>   //여기서 typename은 class라고 써도되고, T는 사용자 임의로 바꿀 수 있음

void showdata(T1 a, T2 b){

cout<<a<<endl;

cout<<b<<endl;

}

이렇게하면 showdata(int형데이타,double형데이타) 이렇게 콜을해도 잘 들어간다.

즉, 입력데이타의 형이 다를경우에는 템플릿의 타입네임을 다르게 해주어야 한다는것

 

 

 

템플릿특수화

템플릿도 오버로딩이 가능하다.

template<typename T>

int SizeOf(T a){

return sizeof(a);

}

template<> //템플릿특수화 선언

int SizeOf(char* a){ //입력변수가 char*형일때는 이 템플릿이 오버로드된다.

return strlen(a);

}

 

여기서 int SizeOf(char* a)라고 써도 맞는것이지만, 정확한 표현은 template<> int SizeOf<char*>(char* a) 라고한다. <char*>는 형구분을 지정해주는곳인가보다.

 

 

클래스템플릿

클래스도 탬플릿화할수있다.

 

template<typename T>

class Data{

private:

T data;

public:

Data(T d);

T getData();

}

template<typename T> //매서드를 정의할대마다 매번 새로 써줘야한다.

T Data<T>::getData(){

return data;

}

클래스템플릿시 주의할점은 Data::getData()로 쓰면 이건 Data class의 매서드정의지, 함수템플릿의 매서드정의가 아니라는점

그래서 데이타형을 꼭 밝혀야한다.

그리고 매 정의 위에 tempate<typename T>처럼 템플릿타입을 정의해주지 않으면 컴파일에러띵~

이제 메인에서 불러보자

int main(){

Data<int> d1(0);

Data<char> d2<'a'>;

 

return 0;

}

템플릿클래스 선언시 항상 <int>나 <char>와 같이 형을 미리 지정해줘야한다. (템플릿함수는 이런 형지정없이 그냥 써도된다)(이유는 메모리가할당되면서 형을 알아야 적절하게 배정시키는데 미리 데이터형지정을 안해주면 컴파일러가 모르기때문이라고 한다.)

 

 

주의. 템플릿은 헤더파일과 cpp로 찢어놓을수 없다고한다.