Purpose-built post

이 포스트는 "Modern C++ Chapter 3.13 Typelist를 통한 클래스 생성"을 보고, 정리한 것이며, 내가 이해한 것이 틀렸다면, 피드백을 받기 위해서, 나 스스로가 공부하기 위해서, 이 챕터를 공부하는 사람들에게 필요할 수 있기에, 만들었다. - 익필

Content

3.12만을 통해서는 아무것도 할 수 없다. 왜냐하면, 타입리스트의 타입 정보만 있지, 데이터를 저장하는 공간이 없기 때문이다. 그래서 이제부터 실제 데이터를 담을 수 있는 공간을 만들어야 한다. (나는 이것을 다른 방법으로 구현했으나, 이 책의 구현이 더 깔끔하다.)

이제부터 나오는 정리는 다음 사항을 사용 할 수 있는 직관력을 필요로 한다.

  • 템플릿 템플릿 파라미터 혹은 템플릿 템플릿 인자

이 템플릿 템플릿 파라미터는 C++ Templates The Complete Guide - C++ 템플릿 가이드 라는 책에 그 개념이 정리되어 있다. 나는 이것을 링크로 대체 한다.

참조 링크

3.13.1 비선형 계층 구조의 생성

선형이란 직선처럼 똑바른 형이나 비례하는 성질을 가리키는 대상을 뜻한다. 이와 반대는 비선형 이란, 똑바른 형이나 비례하는 성질이 아닌 것을 가리킨다. 나는 이 장을 왜 "비선형 계층" 이라고 표현했는지 모르겠다. 책 내용 보면 "상속 구조의 계층 관계가 Typelist 상의 각 자료형들들이 최상위 클래스로 흩어져 있기 때문" 라고 설명한 것이 있다.

이것을 비선형 이라고 하는가? 라고 생각을 곰곰히 하다가, 번뜻 boost::tuple 이 생각났다.

이 것을 비선형이라고 한다면, boost::tuple도 비선형 구조로 만들어졌다는 것을 말이다. 만약 선형 구조로 말한 다면, 각 타입을 최 상위 클래스에서 상속을 타고 내려와 공간을 만들어야 할 것이다.

참조 링크

비선형이라는 단어 때문에, 이야기가 앞서 갔다. 다시 본론으로 넘어와서,

1. 어떻게 typelist의 각 타입들을 공간으로 만들 수 있을까?

방법은 여러개가 있겠지만, 현재 내가 인지한 방법은 boost::tuple 에서 사용한 방법과 Modern C++ Design 에서 사용한 방법이 있다. 이 두 방법은 큰 차이를 보이는데, boost::tuple은 typelist 자체가 공간을 차지하는 형태이고, Modern C++ Design은 공간을 확보하기 위해 typelist를 정보를 읽어와 새로운 타입을 만들면서 확보하는 형태이다.

두개의 차이점은 "내가 공간을 관리한다." 와 "너가 공간을 관리 해준다." 차이 이다.

이제부턴 Modern C++ Design 에 나온 방법만 을 이용하여 정리 하겠다. 너가 공간을 관리해 주기 위해선, 또 다른 공간 생성 메타 함수를 만들어야 한다. 이 메타 함수는 "Typelist 에 있는 타입 정보들"를 읽으며, 공간을 할당해야 한다.

그러므로 다음처럼 만들면 문제는 해결 된다.


하지만, 이것만으로 끝난게 아니다. "각 공간에 접근하는 방법이 너무 불편"하기 때문에, 보다 개선을 시켜야 한다.

Digression

  • 코드가 책과 좀 다른다. 일단 이렇게 유지하고, 끝에가서 살을 더 붙이는 쪽으로 정리해야겠다.


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기