내가 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 <-- 일본어 하지만 .. 코드를 보면 이해가 된다.
제목 그대로, 분명하게 쓰이는데가 있다. 각 어댑터의 용도만 알면 쉽게 이해 할수 있을 듯 하다.
우선 적으로 설명해야 할것은, 술어 구문(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 <-- 일본어 하지만 .. 코드를 보면 이해가 된다.
'책 정리 > Effective STL' 카테고리의 다른 글
항목 46 : 알고리즘의 매개 변수로는 함수 대신 함수 객체가 괜찮다. (0) | 2008.09.07 |
---|---|
항목 45 : count, find, binary_search, lower_bound, upper_bound, 그리고 equal_range 를 제대로 파악해 두자. (0) | 2008.09.07 |
항목 44 : 같은 이름을 가진 것이 있다면 일반 알고리즘 함수보다 멤버 함수가 더 낫다. (0) | 2008.09.07 |
항목 43 : 어설프게 손으로 작성한 루프보다는 알고리즘이 더 낫다. (0) | 2008.09.07 |
항목 42 : less<T>는 operator<의 의미임을 꼭 알아두자. (0) | 2008.09.07 |
항목 40 : 함수자 클래스는 어댑터 적용이 가능하게(adaptable) 만들자. (0) | 2008.09.05 |
항목 39 : 술어 구문은 순수 함수로 만들자. (0) | 2008.09.05 |
항목 38 : 함수자 클래스는 값으로 전달되도록(pass-by-value) 설계하자. (0) | 2008.09.05 |
항목 37 : 범위 내의 데이터 값을 요약하거나 더하는 데에는 accumilate나 for_each를 사용하자 (1) | 2008.09.05 |
항목 36 : copy_if를 적절히 구현해 사용하자 (0) | 2008.09.03 |
최근댓글