2008. 12. 15. 15:43 책 정리/C++ Template

템플릿 인스턴스화 시점이 템플릿 매개변수를 넘겨서, 그 템플릿이 사용 되어질 때라고 정리 했었다. 그렇다면  "매개변수"란? 도데체 무엇일까?

일반 함수의 매개변수는 매개변수 타입의 값이다. 그렇다면 템플릿 매개변수의 타입은 무엇이 있을까?

두가지로 정할 수 있는데, 한가지가 바로 C++에서 타입으로 인정되는 것이 매개변수 타입 중 1개 이고, 컴파일 타임에 인식 될수 있는 상수형 값 이 마지막 타입이 된다.

정리 하자면, 1. C++ 에서 인정되는 타입 2. C++ 에서 컴파일 타임에 인식되는 값 이 두가지가 템플릿 매개변수가 된다.


C++ 에서 타입으로 인정 되는게 무엇일까?

int, unsinged int 등등등 기본 타이과 사용자 타입, 그리고 템플릿 타입이 있다. 템플릿 타입은 역시 템플릿이 사용 되어 질때 인스턴스화된 그 타입을 말한다.


그러면 값으로 인정 되는게 무엇일까?

바로 숫자 상수와, 함수의 주소, 그리고 객체의 주소가 가능하다 이때 객체의 주소는 전역 객체의 주소여야 한다. 왜냐하면 전역 객체의 값을 변경 되어도 주소는 변경 되지 않을 테니까, 오버로딩 되지 않은 멤버 함수의 포인터도 된다고 한다(이것은 해보지 못했다)

멤버 포인터는 &X::of의 형태여야 하며, 주의할 사항은 문자열 리터럴 즉, 문자열 상수는 템플릿 인자로 허용 되지 않는 다는 것이다.


혹시 typedef 해서 재정의한것도 다른 타입으로 인정 되는가?

예를 들어 int 를 int32 로 typedef 했다면, class name<int> 와 class name<int32>는 동일한 클래스라고 할 수 있다. 이것은 코드가 별도로 인스턴스화 되는게 아니라 int 형으로 인스턴스화 된것을 그대로 사용 한다는 것을 의미한다. 또한 typedef 는 절대, 재정의가 아니다. 단지 별명만 지어 짖는것이다.


총평

함수의 포인터를 넘기거나, 포인터를 넘겨서 사용해보지는 않았다. 이런 경우가 대부분이 함수 오브젝트를 만들기 위해서 인데, 이 경우 대부분 boost 라이브러리를 사용 했었기 때문이다.

posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요