언어 자료구조 알고리즘/Escort C++

[C++] 명시적 템플릿 인수 사용

언제나휴일 2016. 4. 15. 15:30
반응형

9.2.1 명시적 템플릿 인수 사용하여 함수 구현

 

 전역 템플릿 함수를 제공하려고 하는데 특정 형식의 인수일 경우에는 템플릿 함수를 기반으로 구체화 된 코드가 만들어지는 것을 피하고 미리 정의된 함수를 사용하게 할 때에는 명시적으로 템플릿 인수를 사용하여 미리 구체화 된 함수를 구현할 수 있습니다. 컴파일러는 명시적으로 구현된 함수와 인수가 일치하면 템플릿 함수를 기반으로 구체화 된 함수를 작성하는 과정이 생략되고 이미 구현된 함수를 호출하도록 컴파일이 됩니다.

 

MyCompare.h

template <typename T>

int Compare(T t1,T t2)

{

    return t1-t2;

}

 

Example.cpp

int Compare<>(const char *str1,const char *str2)

{           

    return strcmp(str1,str2);

}

void main()

{

    if(Compare(10,5)>0)

    {

        cout<<"첫번째 인수가 크다."<<endl;

    }

    else

    {

        cout<<"첫번째 인수가 크지 않다."<<endl;

    }

    if(Compare("hello","yahoo")>0)

    {

        cout<<"첫번째 인수가 크다."<<endl;

    }

    else

    {

        cout<<"첫번째 인수가 크지 않다."<<endl;

    }

}

 예제 코드에서 템플릿 인자 형식이 int Compare<>함수는 템플릿 코드를 기반으로 컴파일러가 작성하여 이를 호출하도록 할 것입니다. 하지만 템플릿 인자 형식이 const char * Compare<>함수는 명시적으로 구현하였기 때문에 Compare("hello","yahoo") 와 같은 호출은 명시적으로 구현된 코드를 호출합니다.

 

9.2.2 템플릿 인자 형식을 명시하여 호출하기

 

 경우에 따라서 템플릿 인자 형식이 같은 여러 개의 입력 인자를 전달받는 템플릿 함수를 호출할 때 사용하는 입력 인자의 형식이 다르더라도 명시적으로 나타내면 컴파일러는 구체화한 함수를 만들어 줍니다.

 

 가령 앞의 예에서 들었던 템플릿 함수 Compare<>를 호출을 할 때 다음과 같이 호출을 하면 컴파일러는 어떠한 템플릿 인자 형식으로 구체화 해야 하는지 모호(ambigous)하여 [그림 9.2]와 같이 컴파일 오류를 발생합니다.


템플릿 매개변수가 모호합니다.

[그림 9.2]

 

 이와 같은 경우 사용자는 다음과 같이 템플릿 인자 형식을 명시하여 호출을 하여 이를 해결할 수 있습니다.

 

if(Compare<int>(num,c)>0)

{

    cout<<num<<""<<c<<"보다 크다."<<endl;

}

else

{

    cout<<num<<""<<c<<"보다 작거나 같다."<<endl;

}


9장 릿

(모든 동영상 강의는 무료입니다.)

반응형