[Effective C++] #41 템플릿, 암시적 인터페이스, 컴파일 타임 다형성, 유효 표현식
Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 7장 "템플릿과 일반화 프로그래밍", 항목 41 "템플릿 프로그래밍의 천릿길도 암시적 인터페이스와 컴파일 타임 다형성부터"에 해당하는 내용입니다.
클래스, 명시적 인터페이스, 런타임 다형성
class Widget
{
public:
Widget();
virtual ~Widget();
virtual std::size_t size() const;
virtual void normalize ();
void swap(Widget& w);
...
};
Widget 클래스 객체는 Widget 클래스의 인터페이스를 지원합니다. 더불어, 가상 멤버 함수 호출은 런타임 다형성에 의해 이루어지죠.
템플릿, 암시적 인터페이스, 컴파일 다형성
template<typename T>
void doSomething(T& w)
{
if(w.size() > 10 && w != badWidget)
{
T temp(w);
temp.normalize();
tmep.swap(w);
}
}
이 템플릿 내부의 표현식이 "유효한 표현식"이 되기 위해, T 타입의 객체는 해당 표현식들을 암시적으로 지원해야 합니다. 더불어 "operator>" 혹은 "operator!=" 등의 함수 호출을 위해 템플릿의 인스턴스 화가 필요합니다. 따라서, 매개 변수의 타입에 의해 결정되는 해당 함수 호출 등은 컴파일 중에 일어나는 "컴파일 다형성"을 갖습니다.
명시적 인터페이스 vs 암시적 인터페이스
class Widget
{
public:
Widget();
virtual ~Widget();
virtual std::size_t size() const;
virtual void normalize ();
void swap(Widget& w);
...
};
명시적 인터페이스는 함수의 시그니처로 이루어집니다. 반환 타입, 매개 변수의 타입, 그리고 상수성 여부 등에 따라서 명시적 인터페이스를 다양하게 지원합니다.
template<typename T>
void doSomething(T& w)
{
if(w.size() > 10 && w != badWidget)
{
T temp(w);
temp.normalize();
tmep.swap(w);
}
}
암시적 인터페이스는 함수의 시그니처에 기반하고 있지 않습니다. 암시적 인터페이스의 중요 요소는 "유효 표현식"입니다. 위 예제 코드를 예로 들자면, size(), swap(), normalize(), operator > ...등의 표현식들이 T 객체에 대해 유효해야 합니다.
클래스 = 명시적 인터페이스 + 런타임 다형성 (함수의 시그니처 기반),
템플릿 = 암시적 인터페이스 + 컴파일 다형성( 유효 표현식에 기반)
'언어 > Effective C++' 카테고리의 다른 글
[Effective C++] #40 다중 상속 (0) | 2022.02.17 |
---|---|
[Effective C++] #39 private 상속 (0) | 2022.02.16 |
[Effective C++] #38 객체 합성, private 영역, "has-a" ,"is-implemented-in-terms-of" (0) | 2022.02.09 |
[Effective C++] #37 가상 함수, 기본 매개변수 (0) | 2022.02.09 |
[Effective C++] #36 비 가상 함수의 상속, 바인딩 (0) | 2022.02.04 |