2008. 9. 7. 12:40 책 정리/Effective STL
내가 STL에 조예가 깊어서 글을 남기는 것이 아니라, Effecitve STL 을 공부하는 사람들이 이 글을 보고, 도움이 되었으면 하는 생각과, 혹시 내가 틀린것이 있다면 지적해 주시지 않을까 란 생각으로 글을 올리는것임을 미리 밝힙니다. - 최익필


제목 그대로, 분명하게 쓰이는데가 있다. 각 어댑터의 용도만 알면 쉽게 이해 할수 있을 듯 하다.

우선 적으로 설명해야 할것은, 술어 구문(predicate) 함수 객체를 받는 알고리즘의 경우, 대상 객체를 인자로 operator()가 호출 되는 형식을 취하고 있다.

문제는

1. f(x);
2. x.f();
3. p->f();

의 형태의 호출을 다음과 같이 처리해야 한다.

1번은 f 를 함수 객체로 만들며, 이 객체의 operator() 가  x를 받으며 호출 되면 된다.
2번은 멤버 함수이므로, f를 함수 객체로 만들고 operator()의 내부에서 x.f() 가 호출되어야 한다.
3번은 멤버 함수이므로, f를 함수 객체로 만들고 operator()의 내부에서 x->f() 가 호출되어야 한다.

이것을 일일이 코드로 짜면서 만들 수도 있지만, 간단하게 할수 있는 방법이 없을까? 란 생각으로 나온것들이

위의 제목에서 말하는 함수들이다.

1.
ptr_fun 은 ptr_fun(test) 이렇게 사용하면 되고,
자세한 설명
http://msdn.microsoft.com/en-us/library/506zz1f0(VS.80).aspx
http://www2.roguewave.com/support/docs/leif/sourcepro/html/stdlibref/ptr-fun.html

2.
mem_fun 은 mem_fun(&Widget::test) 이렇게 사용 하면 되고
자세한 설명
http://kosuchoi.com/blog/kosu/27
http://msdn.microsoft.com/en-us/library/wtc0dy7y(VS.80).aspx


3.
mem_fun_ref 은 mem_fun_ref(&Widget::test) 이렇게 사용하면 된다.
http://msdn.microsoft.com/en-us/library/741a5f2d(VS.80).aspx


여기서 햇갈리기 쉬운것은, mem_fun 과 mem_fun_ref일 것이다.

구조를 파악하면 쉽게 이해가 되는데, 이 둘도 템플릿 함수이다.
1. 함수 객체 생성시 템플릿 인자로 멤버함수의 클래스명을 기억하고 있다가 멤버 함수로써의 포인터를 함수객체가 저장할수 있게 된다.

2. 그리고 operator() 의 매개변수를 컨테이너의 객체로 받고, 이 객체를 타고 들어가, 함수 객체가 가지고 있떤 포인터(멤버함수의)를 결험하여 호출 할수 있게 된다.

3. 이때 컨테이너 객체가 * 로써 저장되어 있다면 mem_fun 을 사용하면 되고, 객체 자체로 저장되어 있거나 & 로써 저장되어 있다면 mem_fun_ref 를 호출하면 된다.

.. 이런 설명보다 mem_fun 과 mem_fun_ref 의 구조를 보는게 훨씬 도움이 되디라 생각하며 이번 항목 정리를 맞친다.


여담으로, 스콧 마이어스는 mem_fun_ref 라는 이름으로 만들었는지 도통 모르겠다고 한다. ..


관련링크
http://www.iamgsi.com/entry/ptrfun-memfun-memfunref-의-필요성
http://yesarang.tistory.com/59
http://radmemo.blog77.fc2.com/blog-entry-122.html <-- 일본어 하지만 .. 코드를 보면 이해가 된다.


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

댓글을 달아 주세요