갓비니

C++ Template : 템플릿, 제너릭 타입 본문

Programming/C++

C++ Template : 템플릿, 제너릭 타입

갓비니 2020. 7. 3. 19:28

함수 중복 시 (같은 내용이지만 매개변수의 형만 다른 경우) 중복된 함수들을 일반화 시키는 특별한 함수가 필요한데,

이 때 template function (=generic function)을 만들면 된다. (중복함수는 최근에는 쓰이지 않음!)

 

< 템플릿 함수 작성 방법 2가지 >

① template(템플릿 선언) <class(제너릭 타입 선언) class_name(제너릭 타입 class_name 선언)>

-> ex) template <class T>

 

② template <typename type_name>

-> ex) template <typename T>

 

 

void swap_func(int &a, int &b){
   int tmp;
   tmp = a;
   a = b;
   b = tmp;
}
void swap_func(double &a, double &b){
   int tmp;
   tmp = a;
   a = b;
   b = tmp;
}

이 둘은 인자의 형만 다를 뿐,  함수가 중복되므로 이렇게 합칠 수 있다.

template <class T>
void swap_func(T &a, T &b){
   T tmp;
   tmp = a;
   a = b;
   b = tmp;
}
-> tmp, a, b모두 T 형이네
int main(){
   int a=10, b=20;
   swap_func(a,b) ->int형이므로 알아서 계산해준다!
}

 

< 일반 변수 말고도 각각 다른 자료형의 배열도 가능! >

#include <iostream>
using namespace std; 

template <class T> // 추상적인 형 T선언 (값이 int일지 , double일지, 뭘지 모르는 친구 앞에는 T 쓰기)

T add(T data [], int n){
   T sum = 0;
   for (int i=0 ; i<n ; i++){
       sum=sum+data[i];
}
   return sum;
  }


int main(){
   int a[] = {1,2,3,4,5};
   double b[] = {1.5 ,2.5 ,3.5 ,4.5 ,5.5};
   add(a,(sizeof(a)/sizeof(int)));
   add(b,(sizeof(b)/sizeof(double)));


}

template <class T1, class T2 ... >  더 여러개도 가능하다!!!

이렇게 두 개 이상의 템플릿을 선언하는 경우는, 

인자를 두 개 이상 받는데 타입이 다를 경우이다.

 

template <class T1, class T2>
void result(T1 x, T2 y){
    cout << "result : " << x <<" , "<< y <<endl ;

 

endl="\n"

 

예 ) 

template <class T1, class T2>

void new_func(T1 src [], T2 dest[], int n) //이런것도 가능하지만

디폴트 매개변수를 지정하면

void new_func(T1 src [], T2 dest[], int n=5)

 

 

< template specialization / 이미 지정한 템플릿을 예외를 재정의하고싶을 때 >

template <class T>
T add(T a, T b){
    return a+b;
}

template <>
string add<string>(string s1, string s2){
   string announce="string은 더하면 합쳐지지롱~";
   cout << s1+s2 << endl;
   return announce;
}

 

 

결론 : 그냥 어떤 함수의 매개변수의 자료형이 매번 바뀔 것 같다? -> 그럼 내가 그 함수를 지정해주고 그 함수의 자료형을 직접 T1, T2 등으로 설정해주는 것)