Skip to content

Latest commit

 

History

History
58 lines (54 loc) · 2.28 KB

Item41.md

File metadata and controls

58 lines (54 loc) · 2.28 KB

항목 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는 위의 두 가지 제약 중 어떤 것도 만족시킬 필요가 없다!