2010.11.27 22:04 책 정리/Modern C++ Design

이 포스트의 목적

  • 일반화 함수자(함수 객체)를 구현하는 방법을 알아 본다.

이 포스트의 준비물

  • VMware player 3.1.2
  • Debian 5 64bit
  • g++ 4.3.2
  • vim 7.1.314
  • project.vim
  • make

참조 서적

  • 안드레 알렉산드레스쿠 저. Modern C++ Design. 이기형 역.
    Addiston-Wesley. 인포북. 초판 2003.07.30. page(190~ 199)

내용

내일 정리한다는게 한달을 훌쩍 넘어갔다. 바쁘다는건 핑계고 어려워서 멈추고 하다가 멈추고를 반복했기 때문이다. 5장 4에서 기본 틀이 있는데, 여기에 정의를 붙여야 한다.

먼저 기본틀에서 함수자의 리턴타입과 인자타입을 정할 수 있으므로. 이제 함수자가 호출할 수 있는 "호출 가능 객체"를 멤버 변수로 저장해 두어야 한다. 그래야 해당 변수로 함수를 호출할 수 있기 때문이다.

작업하기에 앞서 어떻게 변수로 저장할 수 있는지 테스트를 하기 위해서 다음과 같은 함수를 보고, 이해하자.

  • tiny_functor_test 함수의 인자가 템플릿이기 때문에, 함수든, 객체형 함수든 상관없이 받을 수 있다. 이때 템플릿 타입 T로 어떤 타입인지 알수 있다.
  • T로 객체를 정의할 수 있기 때문에, tiny_functor_test 내부에 save_func 변수를 만들수 있었고, save_func() 로 호출 할수 있었다.

위의 간단한 테스트를 통해서, 템플릿 파라미터를 이용해 타입을 얻었다. 그러므로, 함수자의 생성자가 템플릿 생성자이면 된다. 그러면 이것을 기반으로 하나씩 정의해 보자.

  1. 일반 함수, 객체형 함수(함수자), 멤버 함수를 변수로 만들어야 하는데, 멤버 함수는 좀 까다로운게 있으니, 잠시 생략한다. 일반 함수와 객체형 함수(함수자)를 변수로 만들려면, 템플릿 타입이여야 한다.

  2. 아뿔사, 지역변수에선 저장할 수 있으나, 멤버 변수로 저장할 수 없다. 그래서 한번 더 이 템플릿 타입을 포장하고, 이 포장된 타입을 저장할수 있는 도움 클래스가 필요하다.

    이 도움 클래스에 넘겨줄 수 있는 타입정보로는 "호출 가능한 객체의 타입(typename F)과 객체형 함수자(function_object) 를 넘겨줄 수 있다. 이 때 객체형 함수자는 내부적으로 리턴 타입, 파라미터 타입들을 포함하고 있으므로, 이 정보들도 같이 넘겨 줄수 있다.

이것으로 멤버 함수를 제외한 "함수를 호출 가능한 객체"를 함수자로 만들 수 있는 코드가 만들어 졌다.

여담

  • 설명 부분이 너무 부족하다.


posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요