어떻게 하면 특정 자료형을 지울 수 있을까?
가장 작은 알고리즘을 생각한다면, 다음고 같을 것이다.
1. 지울 자료형이 있는지 찾는다.
2. 있다면, 지운다.
3. 없다면, 그대로 둔다.

여기서 "1. 지울 자료형이 있는지 찾는다"에서 다음 질문이 이어 질 수 있다. 어떻게 찾을 수 있는가?
찾는 방법은 찾고자 하는 타입과 비교 대상이 같은지 비교 하는 것이다.

다시 다음 질문으로 이어 질 수 있겠다.
비교 대상은 무엇이며, 어떻게 비교 할 수 있는가?
비교 대상은 typelist 구조상 첫번째 Head 타입일 수밖에 없다. Tail 타입은 typelist이거나 NullType 인데, 이것들은 비교 할 수가 없다. Head 타입을 비교 하는 방법은, 템플릿 부분 특수화 밖에 없다.

여기서 예외가 하나 발생한다. 같은 타입이 여러개 있는 typelist일 경우이다. 이 때는 무시하고 첫번째 타입만 지우기로 한다.

"2. 있다면, 지운다." 이것을 어떻게 만들 수 있을까?
비교가 항상 Head에서만 일어나기 때문에, Head와 지우고자 하는 T가 같다면 Tail이 타입의 끝이라고 알리면 될 것이다.

3. 없다면, 그대로 둔다." 이것을 어떻게 만들 수 있을까?
2번이 일어나지 않을 경우 자연스럽게 NullType 즉, 찾고자 하는 T와 NullType이 만났을 경우이다. 이때는 그대로 NullType이 끝이라고 알리면 될 것이다.

이제 마지막 문제는, 1, 2, 3번을 흐리게 하는 흐름을 어떻게 만들 수 있느냐? 일 것이다.
재귀 알고리즘이 흐름이긴 하나, 어떻게 재귀 알고리즘을 사용 할까? Head 타입과 재거할T타입이 같지 않을 경우가 흐름의 힘이다. 그러므로 Head 타입과 재거할 T타입이 다를 경우, Tail에 지울 자료형이 있는지 다시 찾아보면 될 것이다.

시나리오 준비는 끝났으므로, 코드를 만들어 보자.
이런, 위의 글을 정리해서 쓰고 나서 실제로 코드를 만들다 보니, 지우고자 하는 원소가 typelist 일 경우도 있으므로, 이것도 처리해 둔다. 이 내용은 책에 없다.

후, 재귀 알고리즘을 지겹도록 해보아도 익숙해 지지 않는다. ... .. 읔 이제 남은건 typelist에 지우고자 하는 타입을 1개 이상 찾았을 때 이다.

이때도 곰곰히 생각해 보면, 기존의 Erase와 다른것은 지우고자 하는 타입을 찾았을 때 밖에 없다. 이때는 지우고자 하는 타입을 찾으면 다시 타입을 찾으면 될 것이다. 그러므로 코드는 다음과 같다.

여기서 한참 고민했던 것은 typelist을 지울 때이다. 곰곰히 생각해보면 typelist에서 typelist를 지울 때인데, typelist를 지울 때 내부 타입은 Head를 제외하곤 하나의 typelist로 보여지기 때문에, 한번 밖에 지울수 없는 것을 알 수 있다. 그러므로 typelist를 지울 때 굳이 수정할 필요가 없었다.

여기서의 테스트 코드는 직접 만드는게 도움이 될 듯 싶다. 다음 3.10에서는 중복 자료형의 삭제에 대해서 다루어 본다.

<textarea class="brush:cpp">
</textarea>


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