어떻게 하면 특정 자료형을 지울 수 있을까?
가장 작은 알고리즘을 생각한다면, 다음고 같을 것이다.
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>
'책 정리 > Modern C++ Design' 카테고리의 다른 글
Part 3, 테크닉 3-13 Typelist를 통한 클래스 생성, 1부 (0) | 2010.03.14 |
---|---|
Part 3, 테크닉 3-12 부분적으로 정렬된 Typelist 2부 (360) | 2010.03.13 |
Part 3, 테크닉 3-12 부분적으로 정렬된 Typelist 1부 (360) | 2010.03.08 |
Part 3, 테크닉 3-11 Typelist의 한 원소를 다른 자료형으로 바꾸기 (359) | 2009.09.04 |
Part 3, 테크닉 3-10 중복 자료형의 삭제 (0) | 2009.09.01 |
Part 3, 테크닉 3-8 typelist에 자료형 또는 typelist 추가하기 (0) | 2009.09.01 |
Part 3, 테크닉 3-7 Typelist에 대한 탐색 (0) | 2009.09.01 |
Part 3, 테크닉 3-6 Index에 대한 접근 (0) | 2009.08.31 |
Part 3, 테크닉 3-5 중간 첨언, 왜 재귀밖에 사용하지 못할까? (0) | 2009.08.31 |
Part 3, 테크닉 3-4 Typelist의 길이 계산 방법 (710) | 2009.08.28 |
최근댓글