[Basic C++] #55-3_템플릿 메서드, 이중 템플릿
C++의 템플릿 중 "템플릿 메서드"에 대해 알아보겠습니다.
"전문가를 위한 C"의 11 항목, "템플릿을 이용한 제네릭 코드 작성"에 해당하는 내용입니다.
템플릿 메서드
MyClass<double> myClass1;
MyClass<int> myClass2;
myClass1 = myClass2; // 에러 발생!!
MyClass<double> myClass2(myClass1); // 에러 발생!!
앞서 살펴본 템플릿의 내용에 따르면 "MyClass <int>"와 "MyClass <double> "은 클래스 명은 같지만,
서로 다른 타입을 갖게 되어 다른 객체입니다!
따라서, 서로 간의 대입 연산 혹은 복제 연산이 불가능하겠죠...
하지만! C++는 클래스의 개별 메서드의 템플릿화를 지원합니다!
그러므로, 우리는 서로 다른 타입을 가진 "MyClass <int>"와 "MyClass <double>"의 대입 연산자와 복제 연산자를
개별적으로 템플릿화하는 방법으로 서로 간의 복제 연산 혹은 대입 연산을 가능하게 만들 수 있습니다!
주의할 점은 가상 멤버 함수 혹은 소멸자는 "템플릿화" 할 수 없습니다!
템플릿 클래스 메서드의 개별적인 템플릿화
template<typename T, size_t WIDTH, size_t HEIGHT>
class MyClass
{
public:
MyClass();
virtual ~MyClass();
// 복제 연산자의 템플릿화
template<typename E>
MyClass(const MyClass<E>& src);
// 대입 연산자의 템플릿화
template<typename E>
MyClass<T>& operator=(const MyClass<E>& rhs);
void setElementAt(size_t x, size_t y, const T& inElement);
const T& getElementAt(size_t x, size_t y) const;
size_t getHeight() const { return HEIGHT; }
size_t getWidth() const { return WIDTH; }
private:
T cells[WIDTH][HEIGHT];
};
1. 복제 생성자의 템플릿화
template<typename E>
MyClass(const MyClass<E>& src);
2. 대입 연산자의 템플릿화
template<typename E>
MyClass<T>& operator=(const MyClass<E>& rhs);
3. 메서드의 정의부
// template<typename T, typename E> -> XXXX 안됩니다!!
template<typename T>
template<typename E>
MyClass<T>& operator=(const MyClass<E> rhs)
{
//...
}
위 예제 코드는 템플릿 클래스의 복제 생성자와 대입 연산자를 "템플릿화"하여 서로 다른 타입의 객체들 간의 복제 혹은 대입이 가능하도록 만들었습니다.
여기서, 새로운 타입 파라미터, "typename E"로 복제 생성자와 대입 연산자 메서드에 개별적으로 템플릿 지정자를 추가해주었습니다.
정리하자면, 먼저 클래스 전체적으로 "typename T"에 대해 템플릿화되었으며, 복제 생성자와 대입 연산자는 개별적으로 "typename E"에 대해서도 템플릿화 되었습니다!
'언어 > Basic C++' 카테고리의 다른 글
[Basic C++] #55-5_템플릿 클래스의 파생 클래스, 템플릿 클래스의 상속 (0) | 2022.08.04 |
---|---|
[Basic C++] #55-4_템플릿 클래스의 특수화, 특정 타입에 대한 템플릿 클래스 (0) | 2022.07.28 |
[Basic C++] #55-2_템플릿 파라미터 (0) | 2022.07.27 |
[Basic C++] #55-1_템플릿 개념 ~ 인스턴스화 대상 타입 제한 (0) | 2022.07.23 |
[Basic C++] #54_STL 작업 알고리즘, for_each() (0) | 2022.07.20 |