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 등으로 설정해주는 것)