티스토리 뷰

함수 템플릿 

template <typename T>
T Add(T num1, T num2) 
{
	return num1 + num2;
}

 

- 컴파일러는 템플릿으로 정의한 함수 호출을 만날때 전달된 자료형에 따라 새로운 함수를 만든다. 

Add<int> (1,2) 를 만나면 위의 템플릿에서 T를 int형으로 하는 함수를 새로 만든다.

 

- 하나의 자료형당 하나의 함수가 만들어지기 진다.

 

- 따라서 컴파일시 속도 감소가 발생하지만, 이는 컴파일 시 속도 감소이고 실행 시 속도감소가 아니다.

 

템플릿 함수는 위의 함수 템플릿을 기반으로 컴파일러가 만들어 내는 함수를 뜻한다.

 

템플릿 함수: 

int Add<int> (int num1, int num2)
{
	return num1 + num2;
}

 

- 템플릿 함수와 일반 함수는 구분된다. 

 

 


문제 13-1 [함수 템플릿의 정의]

문제 1

#include <iostream>
using namespace std;

class Point
{
private:
    int xpos, ypos;
public:
    Point(int x = 0, int y = 0) : xpos(x), ypos(y) {}
    void ShowPosition()
    {
        cout << "[" << xpos << ", " << ypos << "]" << endl;
    }
};

template <typename T>
void Swap(T &p1, T &p2)
{
    T temp = p1;
    p1 = p2;
    p2 = temp;
}

int main()
{
    Point p1(1,2);
    Point p2(3, 4);
    Swap(p1, p2);
    p1.ShowPosition();
    p2.ShowPosition();
}

 

문제 2

#include <iostream>
using namespace std;

template <typename T>
T SumArray(T arr[], int len)
{
    T sum = 0;
    for(int i = 0; i < len; i++)
    {
        sum += arr[i];
    }
    return sum;
}

int main()
{
    int arr[] = {1,2,3};
    cout << SumArray(arr,  3) << endl;

    double arr_d[] = {1.2, 3.2, 2.2};
    cout << SumArray(arr_d, 3) << endl;
}

 


함수 템플릿의 특수화 

 

상황에 따라서, 함수의 파라미터로 들어오는 자료형에 따라서 템플릿 함수의 구성방법에 예외를 둘 수 있다.

즉 컴파일러가 함수 템플릿을 이용해 템플릿 함수를 만들때사용자가 정의한 자료형에 대해서는 별도로 만들지 않고 사용자가 정의한 함수를 사용하는 것.

 

#include <iostream>
#include <cstring>
using namespace std;

template <typename T>
T Max(T a, T b)
{
    return a > b ? a : b;
}

// 함수 템플릿의 특수화 
// char* 형에 대해 특수화 
// 문자열의 길이에 대한 비교를 하고있다 
template <>
char* Max<char*>(char *a, char *b)
{
    return strlen(a) > strlen(b) ? a : b;
}

// 사전순 
template<> 
const char* Max<const char*>(const char *a, const char *b)
{
    return strcmp(a, b) > 0 ? a : b;
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함