주의 : 공부하면서 정리한 내용이므로 오류가 있을 수 있습니다.
실습 과제 4-2 :
실습 과제 4-1 의 logical_or 와 logical_and 메타 함수들의 구현을, 인수들을 최대 5 개까지 받을 수 있도록 확장하라.
풀이 :
이 문제를 해결하기 위해서는 가변 개수의 매개변수들을 받을 수 있는 구조를 만들어야 한다.
하지만 안타깝게도 템플릿에 가변 개수의 매개변수를 받을 수 있는 방법은 없다. 일단은 5 개의 매개변수를 받을 수 있는 logical_or 와 logical_and 를 만드는 데서부터 시작하자.
그런데 ( 2 개 이상인 ) 가변 개수의 매개변수를 받기 위해서는 어떻게 해야 할까? 이를 위해서는 템플릿 매개변수에 initializer 를 설정하는 방법이 있다. 사용자가 매개변수를 입력하지 않더라도 자동으로 기본값이 들어 가도록 하는 방법이다. none_ 이라는 구조체를 기본값으로 설정하고, 만약 그 구조체가 입력되면 연산을 종료한다고 가정했다.
이제 logical_and_impl 구현해야 하는데, 이것을 인자가 5 개인 것부터 2 개인 것까지 구현을 한다. 그리고 logical_and_impl 가 다음 매개변수들을 위해 실행되어야 할지를 판단하기 위해 mpl::eval_if 를 사용한다. 다음 매개변수들을 위해 실행되지 않는 경우는 두 가지이다; 현재 조건이 false 일 경우와 매개변수가 none_ 일 경우이다.
매개변수가 none_ 일 경우를 위해서 부분특수화를 구현했다. 그리고 mpl::eval_if 는 게으른 평가를 수행하므로 4-1 의 문제가 제시한 조건을 만족한다.
다음은 소스 코드이다. 그런데 logical_or 는 귀차니즘 때문에 구현하지 않았다. 비슷한 방식으로 구현하면 된다.
다른 사람의 구현도 살펴 보자.
http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?CPPTM_Answers_-_Exercise_4-2
'Programming > CPPTM' 카테고리의 다른 글
[ 번역 ] How Do Those Funky Placeholders Work? (0) | 2013.01.03 |
---|---|
C++ Template Metaprogramming 실습 과제 2-6 풀이 (0) | 2012.12.31 |
C++ Template Metaprogramming 실습 과제 4-5 풀이 (0) | 2012.12.28 |
C++ Template Metaprogramming 실습 과제 4-4 풀이 (0) | 2012.12.17 |
C++ Template Metaprogramming 실습 과제 4-3 풀이 (0) | 2012.12.13 |
C++ Template Metaprogramming 실습 과제 4-1 풀이 (0) | 2012.12.12 |
C++ Template MetaProgramming 실습 과제 4-0 풀이 (0) | 2012.12.10 |
C++ Template MetaProgramming 실습 과제 3-7 풀이 (0) | 2012.12.01 |
C++ Template MetaProgramming 실습 과제 3-6 풀이 (0) | 2012.12.01 |
C++ Template MetaProgramming 실습 과제 3-5 풀이 (0) | 2012.11.29 |