c++ 템플릿 함수

한정화·2023년 4월 1일
0

#230401 토

이번에는 c++의 템플릿에 대해 알아보자~


1. 템플릿 함수 선언

void printAdd(int a, int b){
    cout<<a+b<<"\n";
}

void printAdd(double a, double b){  //함수 오버로딩
    cout<<a+b<<"\n";
}

int main(){
    printAdd(1,2);
    printAdd(1.1, 2.2);
    return 0;
}

위와 같은 오버로딩 함수를 다음과 같이 쓸 수 있다.

template<class T>   //템플릿 선언
void printAdd(T a, T b){
    cout<<a+b<<endl;
}

int main(){
    printAdd(1,2);
    printAdd(1.1, 2.2);
}

템플릿 선언은 template<class T>(템플릿 선언 키워드<제네릭 타입 선언 키워드 제네릭 타입 이름>)으로 할 수 있다. 제네릭 타입이란 무엇이든 될 수 있는 자료형을 의미하고, 제네릭 타립 이름은 사용자 마음대로 할 수 있다. 예를 들어 template<class Te>로 하면 Te로 template 변수를 선언할 수 있는 것이다.


2. 템플릿 함수의 자료형 지정

template <class T>  //템플릿 함수 선언
T findMax(T a, T b, T c){
    if(a>=b && a>=c) return a;
    else if(b>a && b>=c) return b;
    else return c; 
}

int main(){
    cout<<findMax<int>(1,5,3)<<endl;   //int 자료형 지정 
    cout<<findMax<double>(3.3, 6.6, 9.9)<<endl;   //double 자료형 지정
}

선언된 템플릿 함수를 호출할 때 자료형을 지정해줄 수 있다.


3. 제네릭 타입 여러 개 선언하기

#include <iostream>
using namespace std;

template<class T1, class T2>  //제네릭 타입 2개 선언
bool isBigger(T1 a[], T2 b[], int size){
    T1 sum1 = 0; T2 sum2 = 0;
    for(int i=0;i<size;i++){
        sum1+=a[i];
        sum2+=b[i];
    }
    if(sum1>sum2) return true;
    else return false;
}

int main(){
    int arr[10] ={1,2,3,4,5,6,7,8,9,10};
    double darr[10] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.0};
    if(isBigger<int, double>(arr, darr, 10))  //제네릭 타입 2개 지정
        cout<<"arr의 원소의 합이 더 큽니다.";
    else 
        cout<<"darr의 원소의 합이 더 큽니다.";
}

4. 템플릿 함수와 오버로딩 함수

template <class T>
void printAdd(T a, T b){  //템플릿 printAdd 함수
    cout<<a+b<<endl;
}

class Point{
public:
    int x,y;
    Point(int x=0, int y=0):x(x), y(y){}
};

void printAdd(Point a, Point b){  //클래스 Point를 인자로 받는 printAdd 오버로딩
    cout<<"x의 합: "<<a.x+b.x<<endl;
    cout<<"y의 합: "<<a.y+b.y<<endl;
}

int main(){
    Point p1(1,2); Point p2(3,4); 
    printAdd(p1, p2);  //템플릿 함수와오버로딩 함수가 모두 정의되어있을 땐 오버로딩 함수가 호출됨
}

예제 1)

#include <iostream>
using namespace std;

template<class T>
void Swap(T &a, T &b){
    T tmp = a;
    a=b;
    b=tmp;
}

int main(){
    char ch1='A', ch2='B';
    int i1 = 3, i2 = 4;
    
    cout<<"=====swap 이전=====\n";
    cout<<ch1<<' '<<ch2<<endl;
    cout<<i1<<' '<<i2<<endl; 
    
    cout<<"=====swap 이후=====\n";
    Swap<char>(ch1, ch2);
    Swap<int>(i1, i2);
    cout<<ch1<<' '<<ch2<<endl;
    cout<<i1<<' '<<i2<<endl; 
}

5. 클래스 템플릿

#include <iostream>
using namespace std; 

template<class T>
class myArray{
    T arr[100];
    int num;
public:
    myArray(){num=0;}
    void push_back(T n){arr[num++]=n;}
    T front(){return arr[0];}
    T back(){return arr[num-1];}
    
    bool empty(){
        if(num==0) return true;
        else return false;
    }
    int size(){return num;}
}; 

int main(){
    myArray<int> arr; 
    for(int i=1;i<=5;i++)
        arr.push_back(i*10);
    cout<<"배열 사이즈: "<<arr.size()<<'\n'; 
    if(!arr.empty()){
        cout<<"맨 앞 원소: "<<arr.front()<<'\n';
        cout<<"맨 뒤 원소: "<<arr.back()<<'\n'; 
    }
    cout<<endl; 
}
#include <iostream>
using namespace std; 

template<class T1, class T2>

class myData{
private:
    T1 e1;
    T2 e2;
public:
    void setData(T1 a, T2 b) {e1=a; e2=b;}
    void getData(T1 &a, T2 &b){a=e1; b=e2;}
};

int main(){
    myData<char, int> first;
    first.setData('a', 30);
    char c;
    int i;
    first.getData(c, i);
    cout<<c<<'\n'<<i;
}

0개의 댓글