자기 자신을 가리키는 포인터를 리턴하는 함수를 작성할 수 있는가? 그렇다면 그런 함수를 작성 하는 이유는 무엇인가? .. 질문은 이렇게 시작한다. 나에게 큰 시련을 안겨줄것에 대한 운명은 전혀 예상치 못했다. 이렇게 막히게 될 줄이야..


질문을 시작 하면

1. 함수에 대한 포인터는 무엇인가? 어떻게 사용 될 수 있을까?

개인적으로 생각 하자면, 인공지능에 사용 되면 무척 편리하다는 생각을 했었다. 각 상태에 맞게 함수를 붙여 주면서 그 객체의 인공지능이 상태에 맞게 스위칭되는 것을 외부에서 관리할 수 있어, 인공지능 매니저가 인공지능 함수를 관리해서 쓴다면 좋을거 같다.

다른 대안으로는 STL 컨테이너 검색 및 변경 작업에 쓰면 좋을 듯 싶지만, 이건 함수 오브젝트가 있는 이상 ... 그다지 유용하지 않겠다.(물론 wrapper가 함수 포인터를 담겠지만..)

곰곰히 생각해 보면 "루아 스택에 C++ 함수 포인터를 넘길 때 함수 포인터를 사용 한다."


2. 자기 자신을 가리키는 포인터를 리턴하는 함수를 작성할 수 있다고 가정하자. 그 함수는 자신과 같은 시그너처를 가진 함수 포인터도 리턴할 수 있다. 이 방식이 유용하게 쓰이는 경우를 설명하라.

질문 1에서 말했던 인공지능 매니저(?)가 상태에 맞는 함수를 리턴하게 됨으로써 자신의 역활을 수행 할 수 있겠다. 생각해 보면 함수를 리턴한다는 것은 어떤 역활을 수행하는 "것"을 관리 할 수 있다는 것을 뜻하기에 참 적절한것 같다.

책에서는 특정 시그너처를 가진 함수를 리턴하는 함수의 경우 "상태 기계"에 쓰일 수 있다고 말한다.

상태 기계 링크 참조


3. 자기 자신을 가리키는 포인터를 리턴하는 함수 f()의 작성이 가능한가?

책에서 설명하는 초기 방법은 void* 를 반환하게 해서 사용 한다. 다음과 같이..

하지만 이 방법은 가독성이나 여러 모로 불편하다. 그래서 책은 가독성이 더 높다는 이방법을 제안하고 있다.

이 방법은 프록시 패턴을 사용한 것인데, 생소해서 그런지 나는 .. 좀 생소하다; 원리는 클래스의 형변환이 test_type_func를 요구하게 되면, 묵시적 형변환(..? 이라고 해야 하나)이 되어 test_type_func 를 리턴하게 된다.

하지만 나는 이 방법이 좀 꺼린다. 그래서 나의 식을 예로 들면, boost 의 functional 이나 bind 를 사용 할 것 이다. ... 이것은 아마도 bind의 기초가 되지 않을까 한다.


여담

이 문제를 템플릿으로 해결하기 위해서 이리저리 만들다가 void 타입에서 막혀서, google 에서 뉴스그룹을 서비스 하는 comp.lang.c++ 에 올리게 되었다. 

참조 : http://groups.google.com/group/comp.lang.c++/browse_thread/thread/f2b3d90d84f0e9f2?hl=ko#

영어를 못해서 이런 저런 이야기는 할 수 없었지만, 그 답변으로 새로운 것을 알게 되었다.


void 는 타입이 아니다!


총평

조금만 복잡해지만, 가독성 자체가 날라가니, 일반화된 boost 를 사용하는것이 좋겠다 싶다. 왜냐하면, .. 하나의 일관된 표준은 그 사용법과 원리를 익히면, 어떤 경우에서건 가독성이 올라가기 때문이다. 물론 위의 기초를 확실하게 이해 한 상태에서 boost 를 사용 하는것이 좋겠지만..

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

댓글을 달아 주세요