학과 사정상 MFC 를 건드리게 되었습니다. Scavenger 가 생각하기에 MFC 는
좀 더럽다고 생각하기 때문에 -_-;;; 정말 하기 싫은데, 그래도 해야겠지요.
(물론, STL 을 까는건 아닙니다.)
C++ 템플릿은 2가지의 경우로 나뉩니다.
함수 템플릿.
클래스 템플릿.
템플릿은 밑의 Java 에 있는 제네릭과 매우 흡사한 기능입니다.
또한 클래스, 함수 둘다 하는 기능이 다른게 아니라, 단지 함수이냐 클래스이냐에
따라 달라지는 것이죠.
밑의 코드는 함수 템플릿으로 정의 된 코드입니다.
template<typename T>
void func(T a, T b){
cout << "got it";
}
void func(T a, T b){
cout << "got it";
}
알고 계신대로, T 로 선언된 변수는 넘겨지는 대부분의 타입을 받을 수 있습니다.
typename T, typename T2 등으로 계속해서 선언해줄 수도 있습니다.
다음은, 이렇게 선언 된 함수 템플릿을 호출할때, 명시적으로 타입을 구체화 시켜주는
코드입니다.
int main(){
func<int>(1.5,1);
return 0;
}
func<int>(1.5,1);
return 0;
}
눈치채셨겠지만, func 함수를 호출하면서 첫번째 인자로 전달되는 1.5 는
double -> int 로 캐스팅되는 과정을 거치며, 컴파일러는 워닝을 뱉어냅니다.
워닝을 뿜어내지 않게하려면, 호출하실때 다음과 같이 하시면 됩니다.
func<int>((int)1.5,1);
중요한것은, 여기서 인자로 2가지 종류의 타입을 넘길 때
<int> 또는 <double> 등 변수타입을 명시화 해주지 않을경우 컴파일러는 다음과
같은 에러를 뿜습니다.
error C2782: 'void func(T,T)' : 템플릿 매개 변수 'T'이(가) 모호합니다.
즉, T를 무슨 변수로 봐야할지 알 수 없다는 소리이죠.
자, 이번에는 template<typename T>void func(T, T) 함수를 가지고 특수화를
시켜보겠습니다.
template<> void func<double>(double _a){
cout << "fabulous!";
}
cout << "fabulous!";
}
이렇게 특수화를 시켜줌으로써, main 함수에서 func 를 호출할때 인자로 double 형
타입을 넘길경우, got it 이 출력되는게 아니라 fabulous 가 출력되는 결과를 얻으실 수
있습니다. :D
특수화된 함수의 선언은 한 줄에다가 넣는게 일반입니다.
특수화를 코드로 표현하는 방식은 여러 방법이 있는데요, 저 방법이 일반적입니다.
또한, 가장 직관적이기도 하죠 :D
사전에 템플릿 인자로 T, T2 .. 등 2개 이상의 인자로 함수를 정의하였다면
어떻게 특수화를 시킬까요? 다음과 같이 하시면 됩니다.
template<> void func<double, int, ....>(double _a, int _b, ....>{....}
이렇게 하시면 역시 마찬가지로 특수화가 가능합니다.
다음은 위의 func() 함수를 int 타입을 받는 함수로 미리 생성시켜놓는, 즉 명시적 구체화를
해보겠습니다. 딱히 긴 코드는 필요치 않습니다.
template void func<int>(int);
이 선언을 해줌으로써 미리 함수를 생성시켜놓아, 실행시간을 단축시킬 수 있습니다.
이렇게 구체화 시켜놓지 않아도, 해당 함수의 생성이 필요하다고 컴파일러가 판단될 시에
자동으로 암시적 구체화를 합니다. 하지만 이렇게 강제적으로 할 수도 있다는거죠.
컴파일러는 어느 함수를 호출해야 할지에 대해 갈피를 못잡을 수도 있는데 이것에
관해서도 함수호출의 우선순위가 있다는 점은 상당히 재미있는 점입니다.
... 하지만 이건 귀찮아서 못 적겠습니다. (별로 알고싶지 않아요 ㅠ_ㅠ)
아마 커리큘럼상 이런것 까지 토해내라곤 하지 않을겁니다.
궁금하면 언제든지 컴파일러에게 물어보면 되는거니깐요. :D
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST





