템플릿 — C++의 메커니즘으로, 다양한 데이터 유형에서 작동하는 일반화된 클래스와 함수를 코드 중복 없이 생성할 수 있게 해줍니다. 이는 STL의 컨테이너, 알고리즘 및 많은 일반화 프로그래밍 패턴의 구현의 기초입니다.
템플릿의 종류:
클래스 템플릿 예:
template<typename T> class Box { public: Box(T value): data(value) {} T get() const { return data; } private: T data; };
함수 템플릿 예:
template<class T> T add(const T& a, const T& b) { return a + b; }
템플릿 클래스에서 전체 클래스를 전문화하지 않고 하나의 메서드만 명시적으로 전문화할 수 있나요? 가능하다면, 어떻게 하나요?
답변:
네, 가능합니다. 전체 클래스를 전문화할 필요는 없으며, 개별 메서드만 전문화할 수 있습니다:
template <typename T> class Foo { public: void bar(); }; template <> void Foo<int>::bar() { // int에 대한 bar 메서드의 전문화 // 구현 }
이야기
프로젝트에서 비교를 위한 함수 템플릿이 작성되었습니다:template <typename T> bool cmp(const T& a, const T& b) { return a < b; }
<연산자를 가지지 않는 유형과 함께 사용할 때 컴파일 오류가 발생했고, 이는 템플릿이 인스턴스화될 때만 진단 정보가 제공되어서 오랜 시간 동안 찾는데 어려움을 겪었습니다.
이야기
개발자가 사용자 정의 클래스에 대해 사용자 정의 함수 템플릿에서 덧셈을 사용하려 했으나+연산자를 오버로드하는 것을 잊어버렸습니다. 이는 해당 클래스와 함께 호출될 때 컴파일 오류를 초래했습니다.
이야기
클래스 템플릿을 기반으로 하는 컨테이너를 개발하는 과정에서 템플릿 유형에 의존하지 않는 메서드를 작성했으나, 명시적으로 전문화하지 않고 클래스 외부로 추출하였습니다:template<> int MyContainer<int>::size() const { ... }이는 전문화가 선언되었으나 모든 유형에 대해 제대로 구현되지 않아 링커 오류를 발생시켰습니다.