[Basic C++] #55-4_템플릿 클래스의 특수화, 특정 타입에 대한 템플릿 클래스
C++의 템플릿 중 "템플릿 클래스 특수화"에 대해 알아보겠습니다.
"전문가를 위한 C"의 11 항목, "템플릿을 이용한 제네릭 코드 작성"에 해당하는 내용입니다.
템플릿 클래스의 특수화
template<>
class MyClass<const char*>
{
//...
};
C++는 특정 타입에 대해서만 특별한 템플릿 클래스 정의를 사용할 수 있도록 하고 있습니다!
앞서 살펴봤던 "템플릿"의 구현의 목표는 "타입"에 대한 제한 없이 코드 작성이 가능한 제네릭 프로그래밍이었죠!
이때, "템플릿 특수화"라는 개념은 "특정 타입"에 대하여 다른 타입들과 다르게 "특별한 정의"를 적용하고자 하는 것입니다.
정리하자면, "특정 타입"에 대한 "특별한 정의"를 적용하는 것을 "템플릿 특수화"로 기억하면 되겠습니다.
예제 코드
// 템플릿 특수화를 위해 우리는 원본 템플릿이 동일한 스코프에 존재하도록 해야합니다.
#include "MyClass.h" // 원본 템플릿이 들어있는 헤더 파일 #include
template<>
class MyClass<const char*>
{
//...
void setElement(size_t x, size_t y, const char* inElement);
const char* getElement(size_t x, size_t y) const;
//...
}
// 클래스 멤버 메서드의 정의부
MyClass<const char*>::MyClass(size_t inWidth, size_t inHeight)
: width(inWidth), height(inHeight)
{
// 생성자 정의
}
먼저, "템플릿 특수화"를 위해 "원본 템플릿" 코드가 동일한 스코프에 존재하도록 해야 합니다!
"템플릿 특수화"의 장점은 사용자 입장에서 이것이 원본 템플릿 클래스인지 특수화 템플릿 클래스인지 알 필요가 없다는 점입니다.
사용자가 "<const char*>" 타입을 사용해 "MyClass"를 인스턴스 화하면 컴파일러가 자동으로 "특수화 템플릿"을 적용합니다!
이때, 주의할 점은"템플릿 특수화"는 어떠한 코드도 상속받지 않습니다.
따라서, 클래스 전체를 재작성해야 합니다!
* 이해가 쉽도록 원본 템플릿 클래스와 특정 타입에 특수한 클래스를 같이 작성한 예제코드입니다.
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
template<typename T>
class MyClass
{
public:
MyClass() = default;
public:
string myStr = "Normal MyClass";
};
template<>
class MyClass<string>
{
public:
MyClass() = default;
public:
string myStr = "Special Class";
};
int main()
{
MyClass<int> myClass1;
MyClass<string> myClass2;
cout << myClass1.myStr << '\n';
cout << myClass2.myStr;
}
* 결과 화면
'언어 > Basic C++' 카테고리의 다른 글
[Basic C++] #55-6_함수 템플릿 (0) | 2022.08.04 |
---|---|
[Basic C++] #55-5_템플릿 클래스의 파생 클래스, 템플릿 클래스의 상속 (0) | 2022.08.04 |
[Basic C++] #55-3_템플릿 메서드, 이중 템플릿 (0) | 2022.07.27 |
[Basic C++] #55-2_템플릿 파라미터 (0) | 2022.07.27 |
[Basic C++] #55-1_템플릿 개념 ~ 인스턴스화 대상 타입 제한 (0) | 2022.07.23 |