본문 바로가기

[ C/ C++ 프로그래밍 ]/[ STL ]

[ 혼연 정리 ] 함수객체- 4 [함수 객체의 종류]


ㅇ 함수객체의 종류

함수 객체가 하는 일은 비교, 대입, 합산 등 알고리즘 구현중에 필요한 연산을 처리하는 것이다.

밑의 표는 함수객체의 종류를 나타내는 표이다.



InIt find_if(InIt first, InIt last, UniPred F);    /// 단항 bool 리턴
void sort(RanIt first, RanIt last, BinPred F);  /// 이항 bool 리턴
T accumulate(InIt first, InIt last, T val, BinOp op);  /// 이항 bool이 아닌 값을 리턴


 1 struct print {
2      void operator()(int a, int b) const {
3           printf("%d\n",a);
4      }
5 };
6
7 UniOp for_each(InIt first, InIt last, UniOp op)
8 {
9      for (;first != last; ++first)
10           op(*first);                    // 여기서에러발생
11      return (op);
12 }

에러는 런타임 중에 발생하는 것이 아니라 컴파일 중에 뭔가 잘못되었다는 것을 즉시 알 수 있다. ===> 안정성
오작동할 소지가 있는 코드를 컴파일 중에  명백한 에러로 처리하여 실행시의 버그를 최소화 한다.

1 struct print {
2      int operator()(int a) const {
3 return printf("%d\n",a);
4      }
5 };

for_each는 함수 객체를 호출하기만 할 뿐 리턴값을 요구하지 않는다.  위와 같이 수정해도 별 문제는 없다.
리턴값을 넘기더라도 fro_each에서 이 값을 무시할 수 있고 for_each 템플릿의 본체와 충돌하는 부분이 없기 때문이다.

템플릿 타입은 본체의 모든 조건을 만족해야 한다는 동일한 알고리즘 조건이라는 것이 있는데 바로 이 원칙에만 맞게 작성하면된다.

STL은 알고리즘이 어떤 함수를 호출할 것인지에 대한 모든 결정을 컴파일시에 수행한다. 조건만 맞다면 그게 함수건 객체건 가리지 않으며
그래서 일반적이라고 하는 것이다. 컴파일 타임에 모든 점검과 결정이 이루어지므로 컴파일 시간은 조금 더 걸리겠지만 실행시의 호율은 좋을 수 밖에 없다.








ps : 자세한 내용은  www.WinAPI.co.kr 참고