주의 : 저만의 풀이이기 때문에 오류가 있을 수 있습니다.

실습 과제 2-0 : 


T 가 참조 형식이면 T 를, 그렇지 않으면 T const& 를 돌려주는 단항 메타함수 add_const_ref<T> 를 작성하라. 그리고 그 메타함수를 시험하는 프로그램도 작성하라. 힌트 : 결과를 검사할 때 boost::is_same 을 사용할 수 있다.




풀이 :


처음에 문제를 이해하기는 했지만 어떻게 해야 할지 감도 안 잡혔다. add_const 는 쉽게 상상이 가능했다.



왜냐하면 meta function 은 다음과 같이 정의되기 때문이다.


메타함수는 공개적으로 접근할 수 있는 type 이라는 이름의 내포된 결과 형식을 가진,

  • 모든 매개변수들이 형식인 클래스 템플릿

또는

  • 클래스

이다.

- 출처 : C++ Template Metaprogramming, 정보문화사.


그런데 조건이 걸리면서 문제가 생겼다. 조건이 걸렸기 때문에 type 을 반환하기 위해서 뭔가 내부적으로 또 다른 내포된 class template 을 사용하기는 해야 할 것같다고 생각을 했다. 하지만 그게 어떤 형태인지 책을 좀 뒤져 봐도 상상이 잘 안 갔다.


일단 reference 인지 판단을 어떻게 해야 하는지부터가 감이 오지 않았다. 특히나 분기문을 어떻게 구현해야 할지 감이 잘 안 왔다. 그래서 다른 사람들은 어떻게 했는지 googling 을 해 봤다.


http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?CPPTM_Answers_-_Exercise_2-0


보는 순간 "아!"하고 감이 왔다. Compile 시점에 판단을 수행해야 하기 때문에 이는 template 부분 특수화를 통해 이루어지고 있었다. 부분 특수화에 대해서 잘 모른다면, 이전에 번역한 문서인 Template Specialization and Partial Template Specialization 을 참조하기 바란다.


그 중에서 type 이 아니라 실제 value 를 가지고 특수화하는 부분을 이용할 수 있다. 아래 code 를 보면 XXX_impl 라는 식으로 suffix 가 붙은 부분이 있는데, 잘은 모르겠지만 내부적으로 ( 분기문처럼 ) 복잡하게 처리하는 경우에는 그런 suffix 를 붙이는 것 같아서 필자도 붙여 봤다. 나중에 정확한 용례를 알게 되면 소개하도록 하겠다.



필자는 나름대로 구현을 해 본 건데, 위의 링크를 보면 다른 사람의 구현도 참조할 수 있다. 자세히 안 봐서 잘은 모르겠지만, 나름 논쟁이랑 자랑질도 있는 것 같았다. 관심 있는 사람은 직접 구현도 해 보고 비교도 해 보면 좋을 것 같다.


이 과제를 하다가 느낀 거지만 boost 의 meta function 들을 분석해 보는 것도 꽤 좋은 학습이 될 것 같다. 앞으로 하나씩 분석해서 올려 봐야겠다.


결과는 다음과 같다.




+ Recent posts