2009.05.20 13:50 책 정리/C++ Template

개요
저번장까지 이건 이렇고 저건 저렇다 라고 설명한 한 항목이였다. 이번 장은, 실질적으로 코드를 작성하는데 도움이 될 만한 몇가지 문법 들을 설명한다.

5.1 typename
5.2 this
5.3 멤버 템플릿
5.4 템플릿 템플릿 파라미터
5.5 0 초기화
5.6 함수 템플릿에서 문자열 리터럴을 인자로 사용


본문
5.1 typename이란 무엇이고, 어떤 용도인가?
지금까지 typename 은 템플릿 파라미터를 선언할 때 사용하는 키워드로 알고 있었지만, 여기에 한가지 의미가 더 있었다. 바로 "이것은 타입이다" 라고 알려 주는 의미이다.

"이것은 타입이다"라는 의미가 왜 필요한가?
만약, 템플릿 파라미터가 클래스일 떄, 그 내부 타입이, "타입" 이라고 일러주지 않는 다면, 컴파일러가 에러를 벹어 내기 때문이다. 물론 여기까지 문법적인 이야기이고 그 배경이 있지만, 여기서는 설명하지 않는다. 여담, Effective C++ typename 항목에 자세히 나와 있다.

아래 코드를 보고 왜 필요한지 알아 보자.

만약 Draw함수 내부에서 typename으로 이것은 타입이다! 라고 지정하지 않았따면, T의 멤버 변수 value_type 곱하기 ptr; 이라고 해석되도 전혀 이상하지 않을 것이다. 그래서 컴파일러나 프로그래머에게 필요하다.

책에선 다음과 같이 "이것은 타입이다" 라고 할 수도 있다.

하지만 MSVC2005, 2008 에선 되지 않는다. bs 내부의 타입이 있을 경우 .template 으로 선언 할 수 있다고 한다.


5.2 this 는 언제 어떻게 사용 할 때 효과적인가?(템플릿 세계에서...)
클래스 템플릿을 사용하다가, 가끔 이런 현상을 겪은 사람이 있을 것이다.
1. 클래스 템플릿 CLASS<T> 을 만든다.
2. CLASS<T>를 상속받는 GCLASS를 만든다.
3. GCLASS에서 CLASS<T>의 멤버 함수를 호출 이 안된다.

이런 문제를 겪은 사람이 있는가? 물론 나는 겪어 보지 못했다. ... VS2005, VS2008 에선, .. 잘 되기 때문이다. 허허, 위의 상황이 발생 할 수 있는 컴파일러를 만날 수 있으니, 알고 넘어가자. 아래의 예제코드를  복사하여 붙여 넣기 하고, 어떻게 반응하지는 봐보자.

다시 말하지만 VS2005, VS2008 에선 Base<T>::bar() 가 호출 되어 진다. 만약 전역 bar()가 호출 되어 진다면, this를 명시해 주면 된다.

or 다음과 같이 이름 함정자를 붙여 주어도 된다.

안되는 이유는 템플릿이기 때문인데, 컴파일러가 먼저 템플릿을 해석하고, 구문을 해석한다면(비쥬얼 스튜디오는 이렇게 하나 보다), 잘되겠지만, C++ 표준에선, 구문부터 해석하기 때문에, 컴파일이 안되는 것이다. 더 자세한 이유를 보고 싶다면, Effective C++ 항목 43을 살펴 보라. 아참 개인적으로 this-> 를 사용하는 방법을 추천한다.(경우에 따라 달라지겠지만.)


5.3 클래스 템플릿의 멤버 함수는 함수 템플릿이 될 수 있다!?
사실 이게 왜 필요한가 생각해 보면, 별 필요 없겠지 한다. 하지만, 좀 더 유연(유연한게 꼭 좋지만은 않지만)하게 클래스를 디자인 하고 싶다면, 반드시 필요하다.

무엇을 유연하게 만드는가?
음, boost::shared_ptr을 보면, 복사 생성자라든지, 대입연산자의 경우, 함수 템플릿 으로 멤버가 만들어져 있는 것을 확인 할 수 있을 것이다. 이렇게 만들어 두면, 컴파일러가 "복사"라는 작업을 할 때, 다른 타입이라 할지라도, 복사 할 때 무리가 없다면, 승낙을 떨구어 주기 때문이다. 그래서 boost::shared_ptr의 경우 상속성이 있는 클래스의 포인터를 받아 들이기 위하여, 이렇게 할 수 밖에 없었다.

바로 복사 생성자, 대입 연산자 등으로 저장할 요소(멤버 변수)가 적정한(?) 데이터라면, 컴파일러에 의해서 유연하게 성공이 되도록 하기 위한 유연함을 만든다.

코드까지 포함시키려고 하니, 귀찮음이 파도가 치듯이 내 눈꺼풀을 강타하고 있다. 그러므로 Effective C++ 3판 항목 45에, 그 자세한 이야기가 있다는 것을 남기고, 5장 1부를 여기서 끝낸다.

2부에선 마자 정리를 못한 5.4 템플릿 템플릿 파라미터, 5.5 0 초기화, 5.6 함수 템플릿에서 문자열 리터럴을 인자로 사용 을 정리하겠다.

1부 끝

저작자 표시
신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요