방프리
Effective STL 이해하지 못한 항목 - 2 본문
항목 40. 함수자 클래스는 어댑터 적용이 가능하게(adaptable) 만들자
- 이 항목을 살펴보기 전 우리는 먼저 ptr_fun에 대해 알아보아야 합니다. ptr_fun이란 typedef 타입 몇 개를
쓸 수 있도록 만들어 주는 것입니다.
왜 typedef 타입으로 해주어야 할까요?
STL의 4대 표준 함수 어댑터(not1, not2, bind1st, bind2nd)가 모두 typedef 타입으로 동작하기 때문입니다.
표준 STL이 아닌 SGI, Boost 등도 마찬가지 입니다.
그래서 typedef를 제공하는 함수 객체를 "어댑터 적용이 가능하다"라고 하고 제공하지 않는 함수 객체를
"어댑터 적용이 불가능하다" 라고 정의합니다.
typedef를 제공하는 함수 객체는 그렇지 않은 것보다 더 많은 일을 할 수 있고 또 이렇게 만드는 연산비용이
그렇게 비싸지 않습니다.
그렇다면 계속 앞서 말했던 typedef란 무엇일까요?
바로 argument_type, first_argument_type, second_argument_type, result_type 입니다.
직접 어댑터를 만들 생각이 없다면 기본 구조체에서 필요한 typedef를 상속하면 편하게 기능을 제공받을 수 있습니다.
하나의 매개 변수를 받는 operator()를 가진 함수자 클래스라면 std::unary_function을 상속시키면 됩니다.
operator()가 두 개의 매개 변수를 받는다면 std::binary_function으로 상속시키면 되죠
unary_function과 binary_function에 넘겨지는 비포인터(non-pointer) 타입은 const와 참조자 표시를 빼는 것이
상례입니다.
(const를 붙이면 수 많은 오류를 보게 됩니다.)
STL 함수 객체는 C++ 함수를 기본으로 짜여진 것이고, 하나의 C++ 함수는 한 종류의 매개 변수 타입과
하나의 반환타입밖에 가지지 않습니다.
결국 STL은 함수자 클래스는 operator() 함수를 하나 밖에 가질 수 없다고 내부적으로 가정하고 unary_function과
binary_function에 넘겨질 매개 변수와 반환값 타입도 한 가지 뿐입니다.
즉, 하나의 구조체 당 하나의 operator()만이 가능하다는 것입니다.
정리하자면 하나의 함수자 클래스에는 항상 하나의 호출 형태만은 만들 수 있습니다.
'C++ > EffectiveSTL' 카테고리의 다른 글
Effective STL 이해하지 못한 항목 - 4 (0) | 2020.01.19 |
---|---|
Effective STL 이해하지 못한 항목 - 3 (0) | 2020.01.19 |
Effective STL 이해하지 못한 항목 - 1 (0) | 2020.01.18 |
Effective STL (0) | 2020.01.18 |