[Basic C++] #55-2_템플릿 파라미터
C++의 템플릿 중 "템플릿 파라미터"에 대해 알아보겠습니다.
"전문가를 위한 C"의 11 항목, "템플릿을 이용한 제네릭 코드 작성"에 해당하는 내용입니다.
템플릿 파라미터
template <typename T>
템플릿 코드를 작성하기위해 우리는 "<>"안에 파라미터 목록들이 필요합니다.
이러한 파라미터 목록은 함수나 메서드의 파라미터 목록과 비슷합니다.
원하는 개수만큼 작성 할 수 있고, 꼭 "타입"이 아니어도 됩니다!
타입이 아닌(non-type) 템플릿 파라미터
template<typename T, size_t WIDTH, size_t HEIGHT>
class MyClass
{
public:
MyClass();
virtual ~MyClass();
void setElementAt(size_t x, size_t y, const T& inElement);
const T& getElementAt(size_t x, size_t y) const;
// 템플릿 파라미터 목록 중 HEIGHT와 WIDTH를 반환하는 메서드
size_t getHeight() const { return HEIGHT; }
size_t getWidth() const { return WIDTH; }
private:
T cells[WIDTH][HEIGHT];
};
// 1. 클래스 생성자 구현부
template <typename T, size_t WIDTH, size_t HEIGHT>
MyClass<T, Width, HEIGHT>::MyClass()
{
//...
}
// 2. 클래스 멤버 메서드 구현부
template <typename T, size_t WIDTH, size_t HEIGHT>
void MyClass<T, WIDTH, HEIGHT>::setElementAt ( size_t x, size_t y, const T& inElement)
{
//...
}
위에서 얘기했던 것처럼, 템플릿 파라미터는 꼭 "타입"이 아니어도 됩니다!
위 예제 코드는 템플릿 파라미터를 마치 함수의 인자처럼 사용하고 있습니다.
"MyClass" 클래스는 생성자를 통해 "Width" 혹은 "Height"를 결정하지 않고, 템플릿 인자로 받고 있습니다.
이처럼 템플릿 인자를 사용하면 컴파일 타임에 크기 값이 알려져 "최적화"에 유리하다고 합니다!
주의할 점은 템플릿 파라미터의 값이 달라지면 서로 다른 타입으로 취급됩니다.
예를 들면, MyClass< int, 10, 10 > 과 MyClass < int, 10, 11 >은 서로 다른 "타입"이 됩니다!
따라서, 앞선 두개의 객체들은 서로 대입하는 동작 등은 수행할 수 없겠죠.
템플릿 파라미터 목록 중 non-type 파라미터는 인스턴스화된 객체의 타입을 구분하게 하는 인자입니다.
템플릿 파라미터의 디폴트 값 설정
template< typename T = int, size_t WIDTH = 10, size_t HEIGHT = 10 >
class MyClass
{
//...
};
MyClass <> myClass; // 문제 없이 컴파일됩니다!
MyClass<int> myClass2; // 역시, 문제 없습니다!
MyClass<int, 5> myClass3; // 이것 또한 문제없습니다!
템플릿 파라미터는 위처럼 "디폴트 값"을 설정할 수 있습니다!
템플릿 클래스의 메서드의 구현부를 작성할 때, template 지정자에서는 디폴트 값을 생략할 수 있습니다!
'언어 > Basic C++' 카테고리의 다른 글
[Basic C++] #55-4_템플릿 클래스의 특수화, 특정 타입에 대한 템플릿 클래스 (0) | 2022.07.28 |
---|---|
[Basic C++] #55-3_템플릿 메서드, 이중 템플릿 (0) | 2022.07.27 |
[Basic C++] #55-1_템플릿 개념 ~ 인스턴스화 대상 타입 제한 (0) | 2022.07.23 |
[Basic C++] #54_STL 작업 알고리즘, for_each() (0) | 2022.07.20 |
[Basic C++] #53_STL 알고리즘, remove + erase, 옮기고 삭제하기 (0) | 2022.07.19 |