IT Language 연습실
template (2) 함수 ver 본문
그러면 함수 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 |