Application-level프로그래밍

(C++) Template 요약

present 2009. 9. 13. 23:23
<사용법>
클래스 템플릿이나 함수 템플릿의 선언, 그리고 클래스 템플릿의 멤버함수의 정의나 함수 템플릿의 정의  앞에 다음을 붙인다.
즉, 선언과 정의 모두에 Template Prefix가 붙는다.즉,
template<class Type_Parameter1, class Type_Parameter2, ...>

주의: 멤버함수 정의할 때 scope resolution operator 앞에 적는 클래스 이름에는 <Type_Parameter1,... >가 붙는다.


타입 파라미터는 여러개 쓰일 수 있다.
그리고 정의와 선언부에 Type_Parameter 가 타입으로 쓰여야 한다. 여기서의 타입 파라미터는 굳이 클래스가 아니라도 기본 내장 타입이라도 OK.

실제로 클래스 변수 선언할 때에는 클래스 이름뒤에 < Type_Parameter1,...> 이 붙는다. 물론 여기서는 구체적인 타입파라미터가 들어간다. 클래스의 타입을 쓸 때는<Type_Parameter1,...>가 항상 붙는다고 볼 수있다. 클래스 템플릿의 타입은 타입파라미터가 없으면 완전하지 않기 때문이라고 보면 된다. 생성자나 소멸자의 이름은 < ... >가 붙지 않는다.

클래스 템플릿을 상속할 수도 있고, 구체적인 템플릿 파라미터가 들어간 클래스를 상속할 수도 있다.
따라서 상속시 초기화영역에서 부모클래스의 생성자 호출시에는 파라미터가 들어간경우 들어간 이름으로,
들어가지 않았다면 들어가지 않은 이름으로 호출하면 된다.


(예)
template
class Pair
{
public:
       Pair();
       void setFirst(T newVal);
private:
        T first;
};


타입파라미터에 함수의 타입이 들어갈 수도 있는데, 지원하지 않는 컴파일러도 있다. template 의 사용은 컴파일러간 호환문제가 남아있다. 어쨌든 이 경우 사용법은

template
  void apply(Process f, ...)
 {
   int a;
   f(a);
   ...
  }


즉, 인자로 받은 함수의 Signature만 동일화 시키고 f의 내부 구현은 인자에 따라 달라지게 만들 수 있다는 점.


-컴파일러의 문제로 함수(클래스)템플릿의 정의및선언은 실제로 호출되거나 사용되는 코드에 같이 있게 하는 것이 보통이다.
그래서 헤더파일 내부에 이를 구현한 소스코드(템플릿임을 명시하기위해 확장자를 template으로 준다.단독 컴파일을 막는다.) 추가로 인클루드 처리해야한다.