이번 항목은 제네릭 프로그래밍에 있어, 템플릿의 사용은 이렇게 해 주어야 한다 는 것을 말하는 항목이다.바로 질문 넘어가서, 파악해 보도록 하자.

질문 1. "C++ 템플릿은 컴파일 시점 다형성을 제공한다"라는 문장을 설명하라.

.. 런타임 다형성을 안다면, 컴파일 다형성을 이해하기 쉬울 것이다. 런타임 다형성은 상속과 "virtual" 을 이용해, 런타임 중 객체가 상속 상태에 따라 다양하게 .. 말이 어렵잖아.

코드로 봐 보자.

요 코드가 바로 런타임 타임 다형성이다. 그렇다면, 컴파일 타임 다형성은 무엇인가? 위의 코드처럼 컴파일 타임에 다형성을 제공해 주는 것을 말하는데, 코드를 봐 보자.

이것이 바로 컴파일 타임 다형성이다. 런타임과 컴파일 다형성의 차이는 성능과, 그 사용 제약에 있는데, 컴파일 타임 다형성이 성능이 더 좋고, 그 사용 제약이 더 약하다는 특징을 가지고 있지만, 설계하기가 어려운 단점이 있다. 런타임 다형성은, .. 상속이라는 제약과 한번 더 포인터를 타고 내려가야 한다는 연산이 깔리는 단점이 있지만, 보다 더 세밀한 제어가 가능하다는 장점이 있다.

상황에 맞는 것을 골라 써야 할 것이다.


질문 2. 다음 함수의 의미는 무엇이며, 왜 템플릿 매개변수를 두개씩이나 받아야 하는지 설명하라.

우선 함수 .

.. 이 함수는 placement new 를 이용하여, p 위치에 value 의 값으로, 복사 생성자를 호출하여, 덮어씌워 값을 초기화 해주는 함수이다.

그렇다면 왜 템플릿 매개변수를 두개씩이나 받아야 했을까? 아래 코드를 컴파일 해보자.

14 라인에서 컴파일 에러를 벹어 내고 있는데, 그 이유가 템플릿 매개변수 T1의 모호성 때문이다. 첫번째 인자에는 double 형으로 추론되고, 두번째 인자에는 int형으로 추론되니, T1 이 두개의 타입중 무엇을 선택해야 하는지, 컴파일러가 모호하다고 에러를 벹어 내는 것이다.

그래서 템플릿 매개변수를 두개 주어, 각각 추론된 타입으로 호출 되게 하는 것이다. 문제가 생길 수 있는 요지는 T1 의 복사 생성자가 T2를 받는게 있느냐 없느냐에 따라 컴파일 타임 에러를 벹어 내어 주니 좋다.

여기서 좀 더 이 함수를 생각해 보면, 좀 위험한 코드이기도 하다. 이 것은 상속 관계를 가진 객체를 초기화 하는데 있어, ... 좀 위험할 수 있기 때문이다. ^^; 이렇게 하기 보다, 객체를 초기화 해주는 함수를 제공해 주는것이 더 보기 좋을 듯 싶다.


총평

템플릿에 대해서 더 자세히 알아야 할 필요성을 느껴, C++ Template Metaprogramming  책을 샀지만, 이 책은, ... 템플릿 설명이 아닌, 메타프로그래밍 책이다. .. 기초 서적 한개를 사야할 필요성을 느낀다..(학원 에서 살수 있게 한번 추진해 봐야겠다.)

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

댓글을 달아 주세요

  1. 2009.08.02 23:32  Addr  Edit/Del  Reply

    비밀댓글입니다