Item 41: Understand implicit interfaces and compile-time polymorphism

class Widget 
{
public: 
    Widget(); 
    virtual ~Widget(); 
    virtual std::size_t size() const; 
    virtual void normalize(); 
    void swap(Widget& other);
};
void doProcessing(Widget& w) 
{
    if (w.size() > 10 && w != someNastyWidget) 
    {
        Widget temp(w); temp.normalize(); temp.swap(w);
    }
}
  • doProcessing 함수 안에 있는 w는 인터페이스를 소스 코드에서 찾으면 어떤 형태인지 확인할 수 있으므로, 이런 인터페이스를 가리켜 명시적 인터페이스(explicit interface)라고 합니다.

  • Widget의 멤버 함수 중 몇 개는 가상 함수이므로, 이 가상 함수에 대한 호출은
    런타임 다형성(runtime polymorphism)에 의해 이루어집니다.

template<typename T> 
void doProcessing(T& w) 
{
    if (w.size() > 10 && w != someNastyWidget)
    {
        T temp(w); temp.normalize(); temp.swap(w);
    }
}
  • w가 지원해야 하는 인터페이스는 size, normalize, swap등 몇 개의 표현식이 유효(valid)해야합니다. 이런 표현식을 T가 지원하는 암시적 인터페이스(implicit interface)라고 합니다.

  • 템플릿 함수를 호출을 시킬 때 해당 호출을 성공시키기 위해 템플릿의 인스턴스화가 일어납니다. 이러한 인스턴스화가 일어나는 시점은 컴파일 도중이기 때문에 이를 컴파일 타임 다형성(compile time polymorphism)이라고 합니다.

좋은 웹페이지 즐겨찾기