http://saelly.tistory.com/144


- 함수 템플릿과 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;


반응형

+ Recent posts