항목 41. 템플릿 프로그래밍의 천릿길도 암시적 인터페이스와 컴파일 타임 다형성부터
void doProcessing (Widget& w)
{
if (w.size () > 10 && w != someNastyWidget)
{
Widget temp (w);
temp.normalize ();
temp.swap (w);
}
}
특정한 함수(가상 함수)에 대한 실제 호출은 동적 타입 을 기반으로 프로그램 실행중(런타임)에 결정된다.
template <typename T>
void doProcessing (T& w)
{
if (w.size () > 10 && w != someNastyWidget)
{
T temp (w);
temp.normalize ();
temp.swap (w);
}
}
지원해야 하는 인터페이스는 템플릿 안에서 실행되는 연산이 결정한다.
템플릿이 제대로 컴파일되려면 몇 개의 표현식이 유효해야 하는데 이 표현식들이 지원해야 하는 암시적 인터페이스 다.
operator>
및 operator!=
함수가 호출될 때 해당 호출을 성공시키기위해 템플릿의 인스턴스화가 일어난다.
인스턴스화가 일어나는 시점은 컴파일 도중 이다.
인스턴스화를 진행하는 함수 템플릿에 들어가는 템플릿 매개변수에 따라 호출되는 함수가 달라지는데 이것을 컴파일 타임 다형성 이라고 한다.
명시적 인터페이스는 함수 시그너처 로 이루어진다.
암시적 인터페이스는 유효 표현식 으로 이루어진다.
template <typename T>
void doSomething (T& w)
{
if (w.size () > 10 && w != someNastyWidget)
{
...
}
}
T
에서 제공될 암시적 인터페이스는 다음과 같은 제약이 걸린다.
정수 계열의 값을 반환하고 이름이 size
인 함수를 지원해야 한다.
T
타입의 객체 둘을 비교하는 operator!=
함수를 지원해야 한다.
실제로는 연산자 오버로딩 의 가능성이 있기 때문에 T
는 위의 두 가지 제약 중 어떤 것도 만족시킬 필요가 없다!