Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

IT Language 연습실

template (2) 함수 ver 본문

C++

template (2) 함수 ver

akongman 2024. 2. 21. 16:39

그러면 함수 template 을 정의할때 무조건 다 임의에 자료형으로만 써줘야 하나요? 

아니다. 그렇지 않다.

 

예를 들어 

template < class A > // 사실 class A 는 <typename A >와 같은 의미이다.

int function(int num1, A num2) { return (A) num1 + num2; } 

 

위처럼 필요한 곳에만 사용이 가능하다.

그러면 템플릿 함수를 통하여 (A) num1 은 형변환이 가능하기도 하다.

아 하나 더 알려줄게 있는데

(A) num1 이 만약에 A 가 함수 호출과정에서 int로 받았는데 num1의 값은 1.1이 였다면

(int) num1 과 같지 않은가? 근데 사실 (int) num1은 Cpp에서 int (num1) 으로 해도 같이 형변환이 된다.

즉  (A) num1 == A (num1) 은 같은 말이다.

 

------------------- ------------------- ------------------- ------------------- ------------------- -------------------

 

함수 template의 특수화

 

어쨋든 템플릿 함수도 함수의 일종이니 오버로딩이 가능하다는 점이 있지 않은가?

그런데 만약에  함수 template 를 정의하여 템플릿 함수를 생성했고

템플릿 함수를 사용할때 다음과 같은 코드가 있다고 보자.

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

template <typename T>
T function(T box1, T box2) { return box1>box2 ? box1 : box2 ; }

template <> 
char * function <char*>(char * str1 , char * str2) { 
    return strlen(str1)>strlen(str2) ? str1 : str2 ; 
}

template <> 
const char * function <const char*>(const char * str1 , const char * str2) { 
    return strcmp(str1,str2) > 0 ? str1 : str2 ; 
}

int main() { 
    cout<<function(10, 20)<<endl;  
    cout<<function<double>(1.1, 2.0)<<endl;
    cout<<function('A', 'T')<<endl;  
    cout<<function("Yes!", "Yes!");
    
    char array[] = "Yes!";
    char str[] = "No!!!!";
    cout<<function(array, str);
}

 

그렇다면 위 함수를 보면 알 수 있듯이 

    cout<<function(10, 20)<<endl;  
    cout<<function<double>(1.1, 2.0)<<endl;
    cout<<function('A', 'T')<<endl;

위 함수들은 

template <typename T>
T function(T box1, T box2) { return box1>box2 ? box1 : box2 ; }

위 함수 템플릿을 아무 문제 없이 사용할 수 있음을 알 수 있다.

 

그런데 다음의 코드는? 

    cout<<function("Yes!", "Yes!");

 

맞다 문자열 같은 경우는 아무런 의미도 없다. 문자열의 주소값만 반환될 뿐.

문자열의 경우를 비교하고 그러기 위해서는 뭐 길이를 비교하던지 입력된 문자열의 값이 같은지를 봐야하지 않은가?

char * function <char*>(char * str1 , char * str2) { 
    return strlen(str1)>strlen(str2) ? str1 : str2 ; 
}

const char * function <const char*>(const char * str1 , const char * str2) { 
    return strcmp(str1,str2) > 0 ? str1 : str2 ; 
}

 

다음과 같이 함수가 정의되어야 하지 않은가?

 

맞다. 템플릿 함수를 생성함에 있어서 이러한 경우를 특수한 경우라고 말한다.

템플릿 함수 생성을 못하고 별도로 사용자가 정의한 함수를 읽어와야 할때.

template <>

그래서 위와 같은 문장을 사용하게 된 것이다.

위의 문장을 해석할땐 본인은 이렇게 해석하였다.

 

템플릿 함수를 생성함에 있어 예외로! 

"예외로!!"  <<이게 핵심이다.

즉, 예외로 

컴파일러야 예외로 const char * 형이나 char * 의 자료형인 경우에는 템플릿 함수를 별도로 생성하지 말고

내가 정의한 함수를 사용하도록 해!! 

 

라는 의미이다. 

 

이러한 경우가 바로 함수 템플릿의 특수화라는 것이다.!!

'C++' 카테고리의 다른 글

template 파일 분할.  (0) 2024.02.22
template (3) 클래스 ver  (0) 2024.02.22
template (1) 함수 ver  (0) 2024.02.21
cout, endl, cin의 정체  (0) 2024.02.17
상속(3)  (0) 2024.02.13