Purpose-built post

이 포스트는 "Modern C++ Design Chapter 3.13 Typelist를 통한 클래스 생성" 내용을 읽고 정리할 목적으로 만들어졌다. 2부 내용은 생성 후 각 타입 객체에 접근하는 방법에 대해서 정리한 것이다,

Content

현재 나는 책 내용과 다르게 진행하고 있다. 책에선 FieldHelper 를 함수로 구현하여, 원하는 요소에 접근을 한다. 나도 마찬가지로 함수 형태로 구현하려 했지만, 한가지 불편한 것이 있었다. 바로 함수는 템플릿 특수화가 되지 않는 점이였다. 나는 이 방법을 해결하기 위해 몇가지 생각을 했었다. (이것은 직관력으로 바로 생각해 낸 것이 아니라, 일전에 내가 고민하다가, 어떨결에 생각난 것이다.)

내가 제안하는 방법은 템플릿 특수화를 할 수 있게 struct 내에 static 함수를 만드는 것이다. 이는 멤버 함수가 템플릿 특수화에 영향을 받도록 해준다.

이제 보다 쉽게 접근하는 방법을 정리 해 본다.

우선 접근을 편하게 하기 위해서, 프로그래머가 사용 하는 형태를 우선 결정해야 할 것이다. 왜냐하면 최종 형태는 프로그래머의 사용 형태이기 때문이다. 나는 이렇게 생각하기에, 되도록 프로그래머의 사용 형태를 먼저 결정한다.

만약, 이 외의 방법으로 함수등 단위 실행 루틴을 만든다면, 댓글을 달아 주길 바란다.

1. 어떻게 프로그래머가 typelist에 접근하여, 각 요소를 사용 할 수 있는가?

곰곰히 생각해 보면, 타입으로 접근, 인덱스로 접근, 이 두가지 방법 밖에 없어 보인다. 우선 타입 접근을 생각해 보면, 이건 불가능 하다는 결론에 도달한다. 왜냐하면, typelist 내에 같은 타입이 있을 경우, 어떤 타입을 빼오라는 것인지 알 수 없기 때문이다.

예를 들자면, 형과 내가 둘이 집에 있는데, 어머니가 심부름을 시키기 위해 "최씨 한명 나와!" 라고 했을 때, 형과 나는 같은 최씨이므로, 서로 나가기 싫어해, 결국 아무도 안나가게 될 것이다. 만약 어머니가 "첫째 나와" 라고 한다면, 형은 찍소리 못하고 나가서 심부름을 해야 할 것이다.

이 예에서도 나와 있듯이 인덱스를 통한 접근 밖에 그 대안을 찾을 수 없다.

그러므로, 사용 형태는 Field<0>::get(객체) 처럼 쓸 수 있을 것이다.


2. 어떻게 Field<index>::get(객체)를 구현 할 것인가?

struct Field 를 만드는 것이야 어렵지 않다. 재귀호출 함수의 모든 리턴 타입을 어떻게 설정 할 것인가? 이다. 이러한 물음만 본다면, "무슨말 하는거지?" 라고 생각 할 것이다. 나도 리턴 타입을 신경 써야 한다는 것을 예상하지 않고, Field 를 구현 하는 중, 깨달았다.

바로 인덱스로 선택한 타입이 무엇인지 알아야, 함수 리턴타입을 정하여, 함수 정의를 만들 수 있다는 것이다.

그러므로 두가지가 필요하다 get 함수 상세 구현, 특정 인덱스로 typeliset 가 가진 요소 타입을 얻는 구현 이렇게 둘 말이다.

우선 급한 것이 리턴 타입을 결정 하는 것이므로, 먼저 만들어 본다. 이는 추가 설명이 필요 없다. 이 파트 3장을 보고 있노라면, 이건 잠자는 것 처럼 쉽다.


그 다음에, get 구현 부인데, 리턴 타입만 알면, 손쉽게 구현 할 수 있다. 다음 처럼

3. 모든 코드



Digression

  • 가끔씩 내 생각데로만 쓸 때가 있는데, 바로 그게 이번 장 정리 이다.
  • 이번장을 끝으로 3장을 마친다.

  • 책의 typeliset에 공간을 할당하는 방식은 상속기반 비선형 계층 구조 이지만, 내 방식은 포함기반 선형 계층 구조이다. 1부에서 비선형에 대해서 정리했지만, 실제 코드는 선형이다. 개인적인 차이가 있듯이 상속기반은 코드를 보면, 잘 이해가 되지 않아, 되도록 내식데로 정리했다.
  • 이 책만 보면, 2시간이고 시간이 막 가는데, 보고 나면 기진맥진하여, 아무것도 할 수 없는 상태가 된다.



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