[C++] Template Summary – 2/3

기본적인 클래스 탬플릿(Class Template)의 정의

template  class Stack_Tpl
{
private:
	int size_;
	int top_;
	T *pMem_;

public:
	Stack_Tpl(int size) : size_(size), top_(-1) {
		pMem_ = new T [size];
	}

	~Stack_Tpl()
	{
		delete [] pMem_;
	}

	void push(T v) 
	{
		pMem_[++top_] = v;
	}

	T pop()
	{
		return pMem_[top_--];
	}
};

위처럼 클래스의 정의와 선언을 동시에 하는 경우도 있지만, 선언과 정의를 분리할 경우에 맴버 함수의 정의는 다음과 같다.

template void Stack_Tpl::push(T v) 
{
	pMem_[++top_] = v;
}

위에서 정의된 클래스 템플릿을 사용하는 방법, 즉 클래스 템플릿을 인스턴스화 하여 템플릿 클래스로 만드는 방법은 아래와 같다.

Stack_Tpl s(10);

참고로, 위처럼 템플릿을 사용하지 않으면 해당 타입의 클래스 템플릿 코드가 만들어지지 않는다. 이때 사용하지는 않지만 해당 타입에 대한 코드를 명시적으로 만들도록 하는 방법은 아래와 같다.

template class Stack_Tpl;

클래스 템플릿의 경우 템플릿의 인자에 타입 이외에 값도 들어갈 수 있는데, 그 경우의 예는 아래와 같다. (비록 예의 기능이 의미가 없음에도 그 문법 자체에 염두해 두길 바란다)

template  class someClass
{
public:
	someClass();
};

template someClass<T, N>::someClass()
{
	T v = N;
}

또한  템플릿의 인자는 기본값을 가질 수 있다는 점을 알아 두어 코드 작성에 융통성을 발휘하길 바란다. 예를 들어 위의 someClass 클래스의 경우를 약간 변형해보면..

template  class someClass
{ ...

기본 템플릿 인자의 경우 함수 템플릿에서는 적용할 수 없다는 점을 염두해 두길 바란다.

[C++] Template Summary – 1/3

이 문서는 제가 개인적으로 템플릿을 이용해 코딩할때 참고할 만한 자료를 기재해 놓은 것입니다. 템플릿에 대한 전반적인 내용이 아닌 정리라는 점을 염두해 주시길 바랍니다.

먼저 함수 템플릿의 예이다. Type에 상관 없이 두개의 인자를 받아 이 중 최대값을 반환하는 함수 템플릿의 정의.

tpl_decl.h 라는 파일안에 다음과 같은 코드를 정의 한다.

template T max_Tpl(T a, T b)
{
    return (a>b)?a:b;
}

typename 대신에 class를 써도 상관없지만, Type이라는 분명한 의미를 제공한다는 점에서 개인적으로 typename을 선호한다. 이 max_Tpl이라는 템플릿 함수는 헤더파일만…. 존재해야한다는 점이… 늘 걸리긴 했지만, 이제 이런 걸림은 그냥 포기하고 받아 들이기로 했다. 구현을 별도의 cpp 파일로 분리하기 위해 export 라는 예약어가 제공된다고 하나.. Visual C++ 2008에서도 예약어로만 선언되어 있을 뿐 아직 구현되어 지원하지 않는다.

위의 max_Tpl이라는 함수의 활용은 아래와 같다.

#include "tpl_decl.h"

int _tmain(int argc, _TCHAR* argv[])
{
    double max = max_Tpl(100.0, 200.0);

    ...

위의 코드에서 인자가 실수라는 점이 명확하므로 max_Tpl을 간단히 max_Tpl이라고 해도 되나, 템플릿 함수라는 점을 명확하게 하기 위해 을 붙이는 것을 개인적으로 선호한다.

정의한 max_Tpl이라는 함수에 대해 모든 Type에 대해 작동한다고 보장할 수는 없다. 그 하나의 경우로 문자열 타입에 대한 경우인데, 이 경우 문자열 타입에 대해서는 좀더 특별하게 그 구현을 제공해야한다. 그 구현은 마찬가지로 tpl_decl.h 파일에 아래의 코드를 추가한다.

template<> const char* min_Tpl<>(const char* a, const char *b)
{
    return strcmp(a, b)
}

이를 함수 템플릿 특수화라 한다.