템플릿과 static
Programming/C++ 2012. 10. 17. 01:06 |- 함수 템플릿과 static지역변수 -
static 지역변수는 템플릿 함수 별로 각각 존재하게 된다.
실행결과로 알 수 있듯이, 컴파일러에 의해서 만들어진 템플릿 함수 별로 static 지역변수가 유지됨을 보이고 있다.
- 클래스 템플릿과 static 멤버변수 -
static 멤버변수는 변수가 선언된 클래스의 객체간 공유가 가능한 변수이다.
템플릿 클래스 별로 static 멤버변수를 유지하게 된다.
32~33행: 10과 15를 더하고 있다, 그래서 25가 출력.
36~37행: 26행에서 정의한 static 특수화로 인하여 mem이 5로 초기화되고 거기에 100이 더해져서 105가 출력된다.
언제 template <typename T> 를 쓰고 언제 template <> 를 쓰는가?
"템플릿 관련 정의에는 template <typename T> 또는 template <> 와 같은 선언을 둬서, 템플릿의 일부 또는 전부를 정의하고 있다는 사실을 컴파일러에게 알려야 한다."
template <typename T>
class Simple
{
public:
T SimpleFunc(T num) { ... }
};
이 경우에는 템플릿의 정의에 T가 등장하므로 template <typename T> 의 선언을 통해서, T가 의미하는 바를 알려야 한다.
template <>
class Simple<int>
{
public:
int SimpleFunc(int num) { ... }
};
이 정의의 핵심은 <int>이다. 그런데 이 역시 템플릿 관련 정의이기 때문에, 이러한 사실을 알리기 위한 선언이 필요하다.
하지만 이 정의에서는 T라는 문자가 등장하지 않으니, template <> 을 선언하는 것이다.
즉, 정의 부분에 T가 존재하면 T에 대한 설명을 위해서 <typename T> 의 형태로 덧붙이면 되고, T가 존재하지 않으면 <>의 형태로 간단하게 선언하면 된다.
- 템플릿 static 멤버변수 초기화의 특수화 -
특수화는 함수 템플릿 또는 클래스 템플릿만을 대상으로 진행할 수 있는 것이 아니다.
클래스 템플릿 정의의 일부인 초기화문을 대상으로도 진행이 가능하다. 방법도 간단하다. 다양한 특수화와 마찬가지로 T를 대신해서 특수화하고자 하는 자료형의 이름을 삽입하면 된다.
template <>
long SimpleStaticMember<long>::mem = 5;
'Programming > C++' 카테고리의 다른 글
Stack Unwinding(스택 풀기) (0) | 2012.10.18 |
---|---|
예외처리(Exception Handling) (0) | 2012.10.17 |
템플릿 인자 (0) | 2012.10.16 |
클래스 템플릿의 부분 특수화(Class Template Partial Specialization) (0) | 2012.10.16 |
클래스 템플릿의 특수화 (Class Template Specialization) (0) | 2012.10.16 |