본문 바로가기
Effective C++

이펙티브 C++ item 41 : 템플렛 프로그래밍의 천릿길도 암시적 인터페이스와 컴파일 다형성부터

by gong재이 2022. 7. 8.
반응형
class Widget{
public:
    Widget();
    virtual ~Widget();
    virtual std::size_t size() const;
    virtual void normalize();
    void swap(Widget& other);
    ...
};

객체 지향 프로그래밍

void doSomething(Widget& w)
{
    if(w.size() > 10 && w!=someNastyWidget){
        Widget temp(w);
        temp.normalize();
        temp.swap(w);
    }
};

Explicit interface(명시적 인터페이스)

인터페이스를 소스 코드에서 명시적으로 찾을 수 있는 경우를 의미한다.
대개 함수 시그니처로 이루어진다.

* 시그니처 : 함수의 이름, 매개변수 타입, 반환 타입 등을 통틀어 부르는 용어.

runtime polymorphism(런타임 다형성)

특정 함수에 대한 실제 호출이 동적타입으로 런타임에 결정되는 경우를 말한다.

 

템플릿, 일반화 프로그래밍

template<typename T>
void doSomething(T& w)
{
    if(w.size() > 10 && w!=someNastyWidget){
        T temp(w);
        temp.normalize();
        temp.swap(w);
    }
};

implicit interface(암시적 인터페이스)

w의 타입인 T는 size, temp, normalize, swap 등의 멤버함수를 지원해야 한다.
또한, 실행되는 연산, 복사생성자 등도 지원해야 한다.
즉, 컴파일이 정상적으로 되기 위해 몇개의 표현식이 유효해야 하는데 이러한 표현식을 T가 지원해야 하는 암시적 인터페이스라고 한다.

함수 시그니처에 기반하고 있지 않고, 표현식(expression)으로 이루어진다. (표현식의 집합)

 

1. 정수 계열의 값을 반환, 이름이 size인 함수를 지원
T 타입의 객체와 int가 함께 호출될 수 있는 operator> 가 성립될 수 있음
매개변수는 T 타입일 필요는 없고 T타입으로 암시적 변환이 가능하면 ok.

2. T 타입의 객체 2개를 배교하는 operator!= 함수 지원

compile-time polymorphism(컴파일 타임 다형성)

함수의 호출을 하기 위해서 템플릿의 인스턴스화가 일어나야 한다. 
인스턴스화는 컴파일 중에 발생하고, 함수 템플릿의 템플릿 매개변수에 따라 호출되는 함수가 달라지기 때문에 컴파일 다형성이라 부른다.

반응형

댓글