이번 항목은 제네릭 프로그래밍에 있어, 템플릿의 사용은 이렇게 해 주어야 한다 는 것을 말하는 항목이다.바로 질문 넘어가서, 파악해 보도록 하자.
질문 1. "C++ 템플릿은 컴파일 시점 다형성을 제공한다"라는 문장을 설명하라.
.. 런타임 다형성을 안다면, 컴파일 다형성을 이해하기 쉬울 것이다. 런타임 다형성은 상속과 "virtual" 을 이용해, 런타임 중 객체가 상속 상태에 따라 다양하게 .. 말이 어렵잖아.
코드로 봐 보자.
요 코드가 바로 런타임 타임 다형성이다. 그렇다면, 컴파일 타임 다형성은 무엇인가? 위의 코드처럼 컴파일 타임에 다형성을 제공해 주는 것을 말하는데, 코드를 봐 보자.
이것이 바로 컴파일 타임 다형성이다. 런타임과 컴파일 다형성의 차이는 성능과, 그 사용 제약에 있는데, 컴파일 타임 다형성이 성능이 더 좋고, 그 사용 제약이 더 약하다는 특징을 가지고 있지만, 설계하기가 어려운 단점이 있다. 런타임 다형성은, .. 상속이라는 제약과 한번 더 포인터를 타고 내려가야 한다는 연산이 깔리는 단점이 있지만, 보다 더 세밀한 제어가 가능하다는 장점이 있다.
상황에 맞는 것을 골라 써야 할 것이다.
질문 2. 다음 함수의 의미는 무엇이며, 왜 템플릿 매개변수를 두개씩이나 받아야 하는지 설명하라.
우선 함수 .
.. 이 함수는 placement new 를 이용하여, p 위치에 value 의 값으로, 복사 생성자를 호출하여, 덮어씌워 값을 초기화 해주는 함수이다.
그렇다면 왜 템플릿 매개변수를 두개씩이나 받아야 했을까? 아래 코드를 컴파일 해보자.
14 라인에서 컴파일 에러를 벹어 내고 있는데, 그 이유가 템플릿 매개변수 T1의 모호성 때문이다. 첫번째 인자에는 double 형으로 추론되고, 두번째 인자에는 int형으로 추론되니, T1 이 두개의 타입중 무엇을 선택해야 하는지, 컴파일러가 모호하다고 에러를 벹어 내는 것이다.
그래서 템플릿 매개변수를 두개 주어, 각각 추론된 타입으로 호출 되게 하는 것이다. 문제가 생길 수 있는 요지는 T1 의 복사 생성자가 T2를 받는게 있느냐 없느냐에 따라 컴파일 타임 에러를 벹어 내어 주니 좋다.
여기서 좀 더 이 함수를 생각해 보면, 좀 위험한 코드이기도 하다. 이 것은 상속 관계를 가진 객체를 초기화 하는데 있어, ... 좀 위험할 수 있기 때문이다. ^^; 이렇게 하기 보다, 객체를 초기화 해주는 함수를 제공해 주는것이 더 보기 좋을 듯 싶다.
총평
템플릿에 대해서 더 자세히 알아야 할 필요성을 느껴, C++ Template Metaprogramming 책을 샀지만, 이 책은, ... 템플릿 설명이 아닌, 메타프로그래밍 책이다. .. 기초 서적 한개를 사야할 필요성을 느낀다..(학원 에서 살수 있게 한번 추진해 봐야겠다.)
'책 정리 > Exceptional C++ Style' 카테고리의 다른 글
항목 10 : export의 한계, 2부 : 상호작용, 유용성 문제, 지침들 ( 난이도 : 9 ) (1) | 2009.01.13 |
---|---|
항목 9 : export의 한계, 1부 : 기초 ( 난이도 : 7 ) (1) | 2009.01.13 |
항목 8 : 템플릿 친구 만들기 ( 난이도 : 4 ) (1) | 2009.01.12 |
항목 7 : 함수 템플릿을 특수화하지 말아야 하는 이유 ( 난이도 : 8 ) (4) | 2009.01.09 |
항목 6 : 여러 수준의 일반성, 2부 : 충분히 일반적인가? ( 난이도 : 7 ) (0) | 2009.01.08 |
항목 4 : 표준 라이브러리 멤버 함수 ( 난이도 : 5 ) (0) | 2008.12.31 |
항목 3 : 문자열 포매팅, 2부 : 표준의 세련된 대안들 (0) | 2008.12.29 |
항목 2 : 문자열 포매팅, 1부 : sprintf ( 난이도 : 3 ) (0) | 2008.12.24 |
항목 1 : vector의 올바른 용법과 잘못된 용법 ( 난이도 : 4 ) (0) | 2008.12.23 |
Exceptional C++ Style 책을 보기 시작하다. (0) | 2008.12.23 |
최근댓글