2014-04-16 4 views
1
class StrangeFunctor 
{ 
    public: 
    StrangeFunctor(int (*comp)(string, string)) 
    { 
     this->comp = comp; 
    } 
    int operator()(string str1, string str2) 
    { 
     return –comp(str1, str2); 
    } 
    private: 
    int (*comp)(string, string); 
} 

위 코드가 실제로 무엇을했는지 궁금했습니다. functor가 제대로 초기화되어 비교 목적을 위해 정렬 함수에 주어 졌다고 가정하면, 내 직감은 전달 된 인수의 순서를 뒤집어 놓는다는 것입니다. 그러나 그것이 맞는지, 왜 올바른지는 확실하지 않습니다.Functor 및 함수 포인터 논리

+0

어떤 종류의 정렬 기능이 있습니까? 확실히'std :: sort'가 아닙니다. 그것은 비교가 equals에 대해서는 0보다 작고 -1보다 큰 경우에 음수 값을 반환 할 것으로 기대하는 정렬 함수에 대해 설명하는 방식으로 실제로 작동합니다 (qsort와 유사하지만 전달할 수는 없습니다. 'qsort'에 대한 함수 객체). –

+0

@IgorTandetnik 그렇습니다. 단 한가지 예외는 있습니다 : 만약'comp'가'INT_MIN'을 리턴하면'-'는 오버플로를 일으킬 것입니다 ('int'의 일반적인 2의 보수 구현을 가정 함). – svick

답변

1

이 펑터는 함수 포인터를 가져 와서 해당 메서드의 반환 값에 대한 부호를 뒤집습니다.

return –comp(str1, str2); 

당신이 말한 것처럼 정렬과 함께 사용하면 원래 함수 포인터에 의해 주어진 정렬 순서를 뒤집을 수 있습니다.