2009.08.20 22:12 책 정리/Modern C++ Design

3.1 에서 필요성에 대해서 이야기했고, 어떻게 사용하면 좋은지도 이야기 했었다. 하지만 그 사용법은 현재의 템플릿으로는 정의 할 수가 없다. 왜냐하면 템플릿은 가변 템플릿 파라미터란 개념이 없고, 고정된 템플릿 파라미터를 요구하기 때문이다.

그렇기 때문에 템플릿이 아니라 템플릿 메타 프로그래밍을 하여, 가변 템플릿 파라미터를 받을 수 있도록 만들어야 한다.

문제는 어떻게 인데, ... 생각하기 어렵다면 이미 만들어져 있는 boost::tuple을 사용해도 좋을 듯 싶다. 하지만 어떻게를 알고 싶다면, 책을 몇번이라도 읽기를 바란다.

그렇다면, 지금부터 "어떻게" 정의 할 수 있는지 알아보자.
우선 사용법 3.1에서 표기했다. 다시 옮기자.

우선 1차적으로 일일이 템플릿으로 정의해 보면 다음과 같다.

음~ 이런것을 10개쯤 만들면 그런데로 쓸만 할 것이다. 하지만 이러한 정의는 할수가 없다. 두개의 클래스 템플릿의 이름이 동일 때문이다.

이러한 템플릿은 더 많은 타입들이나 더 적은 타입들을 받을 수 없다!! 최초 typelist 정의시 한 10개쯤 잡고, 1개 이상의 타입에선 Nulltype을 기본파라미터를 주면 손쉽게 되겠다고 생각하여 다음처럼 만들어 보았다.

컴파일도 잘된다. 하지만 템플릿 파라미터 갯수가 늘어남에 따라 불필요한 객체(1바이트이지만)가 늘어나고 미리 정의한 갯수를 초과할 수 없다는 문제점을 갖고 있다.(boost::tuple은 10개 제한했지만 불필요한 객체는 없다.)

좀더 좋은 대안을 생각해 봐야 한다. 한번에 여러개를 정의하는 방법은 포기하고 자기가 자기 자신을 담는 형태, 즉 재귀적으로 자신을 포함해 나간다면, 무제한으로 타입을 받을 수 있을것 같다. 그러므로 다음 코드를 봐보자.

오오! 잘 컴파일 되고 잘 된다. 무한으로 typelist의 인자를 늘릴 수 있지만, 사용하기에 두가지 큰 문제가 있는데, 하나는 사용하기 어렵다는 것이고, 다른 하나는 NullType도 객체의 크기(1바이트겠지만)를 불필요하게 메모리에 올려 둔다는 것이다.

곰곰히 생각해 보면, 템플릿 특수화를 이용하여, 두번째 템플릿 파라미터가 NullType일 경우, T0의 객체만 가지고 있게 한다면, 두번째 문제는 해결 할 수 있다는 것을 알 수 있다.

이것으로 불필요한 객체를 갖는 문제는 잡았다.

하지만 아직 정의방법이 어렵고 사용방법 또한 감잡기가 어렵다. 다음 포스팅에서는 이 문제를 해결 할 수 있도록 준비하여 정리하겠다.

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

댓글을 달아 주세요