클래스에서의 탬플릿
템플릿은 함수뿐만아니라 클레스에서도 사용이가능하다.
대부분의 경우 선언, 작동방식, 특수화의 경우는 함수와 유사하다.
동일한 부분에 대해선 짧게 넘어가고, 클래스와 템플릿에 대해서 설명하지 못한 부분에대해서 추가적으로 이야기해본다.
Syntax
template <typename T>
class TEST{
private:
T num;
public:
TEST(T x=0);
void show();
함수와 사용방법은 동일하다. template을 선언하고 <typename T>를 기준으로 T로 설정하고 싶은 변수들에게 T를 부여하면된다(..?)
당연하겠지만 TEST를 변수로 갖는 TESTER 클래스가 있다면, T에 TEST 클래스가 들어갈 수 있게된다. TESTER<TEST<int>>() 와 같은 형식으로..
또한 함수처럼 클래스를 다음과 같이 정의하여 특수화를 할 수 있다.
template<>
class TEST<int> { ... }
이렇게 정의한다면, TEST<int>에 대해선 일반 템플릿을 사용하지 않고 사용자가 선언한 클래스에서 불러오게된다.
++ 부분특수화가 가능하다.
template <class T1>
class TEST<T1, int> {...}
위와같은 방식으로 하게되면 < ? , int>인 템플릿 클래스는 모두 위 클래스를 불러온다.
템플릿에게도 인자를 부여할 수 있는데 이를 템플릿 메개변수라고 한다.
template <class T, int len>
class TEST {...}
이를 호출할땐 TEST<int, 5> test;
와 같이 정의 할 수 있다.
또한 템플릿 매개변수는 디폴트 값 설정도 가능하다.
template <class T, int len=10>
class TEST {...}
호출할때 따로 len값을 전달하지 않으면 10이 기본적으로 들어가게된다.
템플릿과 static 변수
static은 같은 템플릿 함수 내부에서 값을 공유 하는데, 이는 템플릿의 type에 따라 각각 작동한다.
예를들어, TEST<int>()
에서의 static값을 TEST<long>()
에서의 static값에 영향을 주지 못한다.
클래스 또한 유사한 방식으로 작동한다.
템플릿 클래스 별로 static 변수를 공유하게된다.
즉, class<int>와 class<int> 의 static변수는 서로 공유되지만, class<int>와 class<long>의 static변수는 다르게 작동한다.