Purpose-built post

이 포스트는 "Modern C++ Chapter 3-12 부분적으로 정렬된 Tytpelist"를 보고, 내가 이해한 것이 틀렸다면, 피드백을 받기 위해서 또는 나 스스로가 공부하기 위해서 또는 이 챕터를 공부하는 사람이 조금이나마 도움이 되기 위해서 만들었다. - 익필

Content

2009년 9월 4일날 3-11장을 본 후 3-12장을 보았지만, 도무지 이해가 되지 않았기 때문이다. 그래서 나는 이 장에서 멈쳤었다. 그러다가 이 3장에 트랙벡이 날라 온 것을 보고, 무기한 연장할 순 없어, 다시 책을 펴본다.

이 부분을 보면서 느낀 점은 "도대체 이것을 왜 해야지? 저자가 기술적 향연을 위하여, 하는건가?" 라고 생각했으나, 책에선 이러한 답변이 있었다. (이걸 보고 이 책의 저자도 어렵다고 생각 하는 것을 알았다.)

"지적인 놀이 이상의 가치는 없는 연습문제 처럼 보일 지라도, 계층 구조를 아래에서부터 훑을 수 있는 방법을 제공해 준다. 이는 자료형에 관한 정보를 가늠해 내기 위하여 이러한 중요한 속성을 이용한다."

이 말이 POD 형 데이터를 찾기 위해서 템플릿 메타 프로그래밍을 하는 것 처럼 "계층 구조가 있는지 찾기 위해서"라고 이해 할 수 있을듯 싶다. (아직 정보를 가늠해 얻을 수 있는게 무엇인지 모르므로, 11장에 가서 이 의미를 파악해 봐야 할 것 같다.)

본론으로 돌아와서, 아직은 템플릿 메타 프로그래밍 코드로 최대 상속한 타입을 앞에다 놓는 코드를 창조 할 실력 또는 영감이 없으므로, 이미 책에 만들어진 코드로 분석을 해본다.

사용 형태데로 코드를 작성해 본다면, DerivedToFront<T>::Result 형식으로 최고로 상속된 타입을 앞으로 끌고온 타입 리스트를 얻어야 할 것이다. 그러므로, 초기 형태는 다음과 같아야 한다.

예외처리 해야 할 것이 있다. 바로 널 타입 즉, 아무 타입도 아닌 타입이 템플릿 파라미터로 넘어올 경우를 대비해야 한다. 즉, NullType 일 경우, 아무 작동도 안하게 만들어야 한다. 코드는 다음과 같아야 한다.

이제 널 타입 처리는 되었고, 속을 채워야 하는데, 의사코드로 만들면 다음과 같다.

  1. 일단 최대로 상속 받은 녀석을 찾고 이름을 TheMostDerived 라고 이름을 짖는다.

  2.  그 타입을 알고 있으니, 이제 그 타입을 맨 앞으로 넣기 위해서, 맨 앞 타입을 비워놔야 하므로, 맨 앞 타입을 최대 상속한 타입 자리에 올려 놔야 한다. 이렇게 만들어진 타입을 L 이라고 이름을 짖는다.

  3. 그리고 TheMostDerived 타입을 맨 앞으로 타입을 옮겨야 한다. 이렇게 만들어진 타입을 Result 라고 이름을 짖는다.

이렇게 생각한 것을, 코드로 옮기면 다음과 비슷할 것이다. (같다라고 아직은 표현할 수 없다. 아직 창조 할줄 모르니까!)


여기에 설명이 더 필요한것이 있는데,

  1. 아직 설명이 불가능하다, 최대 상속 타입을 찾는 방법을 모르기 때문이다.

  2. 현재 헤드 타입을 최대 상속 타입 자리로 올리므로써, 이동을 시키는 것이다. std::swap(a, b) 내부에서 b = a 에 넣는 것 처럼 b 자리에 a를 넣어 둔다. 1번은 temp = b를 넣는 것이다. : )

  3. 2번으로 만들어진 타입과 최대 상속 타입을 결합하는 것이며 std::swap(a,b) 에서 a = temp 넣는것이다. 그리고 Result로 해당 타입을 밖으로 빼낼 수 있게 만든다.

여기까지가 1단계, 최대 상속타입을 앞으로 놓으므로써, 부분 정렬을 한 타입 리스트를 얻어오는 ㄷ것이다. 2단계는 다음에 시간 날때 정리해야겠다. ... 이 책만 보면, 완전 기진 맥진 하다.

Digression
  • 템플릿 메타 프로그래밍에서 가장 중요한 것은, 프로그램 흐름을 잡는 일이다. 라는 것을 알았다. 이것은 모든 프로그래밍을 이해하는 가장 기본적인 단계가 아닐까 한다. 템플릿 메타 프로그래밍이라는 신선한 프로그래밍을 알기 위해서 몇시간동안 이 구문만 보았다가, 문득 이 생각이 떠올랐다. "도대체 어디가 프로그램 시작인거야!?"" 라는 물음을 통해서..

    시작은 Result 가 시작이다. Result 부터 추적해 들어가면, 길이 보인다.

  • 이해가 되지 않는 다는건, 프로그램 흐름을 찾는 것을 놓쳤다 라고 표현해야 할 것이다.


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