태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.
학과 사정상 MFC 를 건드리게 되었습니다. Scavenger 가 생각하기에 MFC 는
좀 더럽다고 생각하기 때문에 -_-;;; 정말 하기 싫은데, 그래도 해야겠지요.
(물론, STL 을 까는건 아닙니다.)

C++ 템플릿은 2가지의 경우로 나뉩니다.

함수 템플릿.
클래스 템플릿.

템플릿은 밑의 Java 에 있는 제네릭과 매우 흡사한 기능입니다.

또한 클래스, 함수 둘다 하는 기능이 다른게 아니라, 단지 함수이냐 클래스이냐에
따라 달라지는 것이죠.

밑의 코드는 함수 템플릿으로 정의 된 코드입니다.

template<typename T>
void func(T a, T b){
        cout << "got it";
}

알고 계신대로, T 로 선언된 변수는 넘겨지는 대부분의 타입을 받을 수 있습니다. 

typename T, typename T2 등으로 계속해서 선언해줄 수도 있습니다.

다음은, 이렇게 선언 된 함수 템플릿을 호출할때, 명시적으로 타입을 구체화 시켜주는
코드입니다.

int main(){
        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!";
}

이렇게 특수화를 시켜줌으로써, 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
저작자 표시 비영리 변경 금지
Creative Commons License
Creative Commons License
http://www.iamscavenger.com/trackback/39 관련글 쓰기
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST