프로그래밍/cpp

비타입 인수,디폴트 템플릿 인수,특수화 (클래스,함수 템플릿) c++

콘파냐 2014. 6. 18. 18:37

비타입 인수(Nontype Argument)는 


타입이 아닌 실제 값을 말합니다. 


실제 값은 변수가 아닌 상수를 말합니다. 


대표적인 예로 배열객체를 만드는 클래스를 클래스 템플릿으로 만들어 보겠습니다.






멤버변수로 배열이 선언되었지만, 초기화가 안되 있습니다. 배열의 특성상 구체화(컴파일시)와 동시에 초기화가 되어야 하기 때문에 N값에 상수가 필요합니다. 템플릿을 이용해서 객체 생성시로 초기화를 미룰 수 있습니다. 이렇게 하면 클래스로 원하는 타입과 크기의 배열 객체를 생성할 수 있습니다. 템플릿을 사용하지 않고서는 클래스로 원하는 객체를 만드는 방법은 동적할당을 이용하는 방법일 겁니다. 동적할당을 사용하면 실행중 언제라도 배열을 크기도 바꿀 수 있고 실행시간 중에 생성할 수도 있습니다. 하지만 동적할당은 신경써야할 부분이 많기 때문에 간단한 배열이라면 위 정도 템플릿이면 충분합니다.


함수템플릿 에서의 비타입인수


함수의 인수로 상수가 올 경우는 없기 때문에 비타입 인수의 경우 함수의 내부에 서 사용되어야 합니다. 


디폴트 템플릿 인수

디폴트를 선언하려면 다음과 같이 선언합니다.

template <typename T = int, int N = 10>

class Array {

~~

}


Array<> ar("abc");

만약 에러가 난다면, -std=c++11옵션을 붙여서 컴파일 하도록 합니다. 원래 디폴트 템플릿 인수는 클래스에서만 적용되었는데 C++11에서는 함수도 사용이 가능하게 되었습니다.


명시적 구체화

함수 템플릿에서 명시적 구체화를 하면 인수를 읽어들이기 전에 함수를 구체화 한다고 하였습니다. 때문에 암시적 변환이 가능하다고 했습니다. 클래스에서도 명시적 구체화를 할 수 있습니다. 

template class Array<int>; //예

객체 생성시에 구체화 되는 것이 아니라, 객체 생성유무를 떠나서 구체화합니다.


특수화(부분 특수화)

특수화는 특정 인수타입에 대해서 다른 알고리즘의 클래스나 함수를 구체화하고 싶은 경우 사용합니다. 


template<> class Array<int> {

~~

};

부분 특수화

부분 특수화는 2개 이상의 인수를 가질 경우 하나의 인수의 경우만 맞아도 특수화를 시킬 수 있습니다.

위 Array 클래스는 두개의 인수를 가집니다.


가독성이 매우 안 좋은 문법입니다. 

template <int N> class Array <int, N> 

여기서 <int N>은 템플릿 인수를 뜻합니다. 특수화를 하려는 인수가 아닌 점에 주의하세요. 그리고 <int,N> int인수로 특수화했습니다.

Array 객체 생성시 다음과 같은 형식에 위 클래스가 구체화됩니다.

Array<int, 10> A;

여기까지 대략적인 템플릿 문법을 살펴 보았습니다.

반응형