자기 자신을 가리키는 포인터를 리턴하는 함수를 작성할 수 있는가? 그렇다면 그런 함수를 작성 하는 이유는 무엇인가? .. 질문은 이렇게 시작한다. 나에게 큰 시련을 안겨줄것에 대한 운명은 전혀 예상치 못했다. 이렇게 막히게 될 줄이야..
질문을 시작 하면
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 를 사용 하는것이 좋겠지만..
'책 정리 > More Exceptional C++' 카테고리의 다른 글
항목 30 : 스마트 포인터 멤버 Part 1 : auto_ptr로 인해 생길 수 있는 문제 ( 난이도 : 5 ) (0) | 2008.12.14 |
---|---|
항목 29 : auto_ptr 사용 하기 (난이도 : 5) (0) | 2008.12.14 |
항목 35 : #define (난이도 : 4) (0) | 2008.12.13 |
항목 34 : 전처리 매크로 ( 난이도 : 4 ) (0) | 2008.12.13 |
항목 33 : 네스티드 함수 시뮬레이션 (nested function) ( 난이도 : 5 ) (0) | 2008.12.13 |
항목 40 : 네임스페이스 Part 2 : 네임스페이스로 마이그레이션(migration) (난이도 : 4) (0) | 2008.12.08 |
항목 39 : 네임스페스 Part 1 : using 선언과 using 지시자 (난이도 : 2) (1) | 2008.12.08 |
항목 38 : typedef (난이도 : 3) (0) | 2008.12.08 |
항목 37 : 전방 선언(forward dclarations) (난이도 : 3) (0) | 2008.12.08 |
항목 36 : 초기화 (변수 초기화, 생성자의 문제점) (난이도 : 3) (0) | 2008.12.07 |
최근댓글