2017-01-09 1 views
1

나는() 연산자를 오버로드하여 비교를 수행했으며이를 표준 정렬 함수 호출의 세 번째 인수에 비교 자로 보내려고합니다. 이제이 호출은 threeSum이라는 다른 멤버 함수에 있습니다. 그걸 보내면 Solution()이 작동하지만 this()은 작동하지 않습니다. 이 구문 규칙은 무엇입니까?같은 클래스의 다른 멤버 함수에서 펑터를 호출하는 방법은 무엇입니까?

class Solution 
{ 
public:  
    bool operator() (int i, int j) 
    { 
     return (i < j); 
    } 

    vector<vector<int> > threeSum(vector<int> & nums) 
    { 
     sort(nums.begin(), nums.end(), this()); 

     vector<vector<int> > ret_vec; 
     ... 
     return ret_vec; 
    } 
}; 

고맙습니다.

+0

비교기를 사용해야하는 곳은 어디입니까? – simplename

+0

'bool operator() (int i, int)와 같이 연산자를'const'로 만들 필요가 있습니다. j) const {...}' –

답변

0

this()이 작동하지 않는 이유는 this이 포인터이기 때문입니다. 먼저 역 참조를해야합니다. 좀 더 명시 할 경우,

sort(nums.begin(), nums.end(), (*this)); 

을 또는 :

Solution& this_val = *this; 
sort(nums.begin(), nums.end(), this_val); 
+0

'1'과'2'로'operator()'를 호출하는 것은 의미가 없기 때문에'std :: sort'는 그들을 정렬 할 수 있도록 두 개의 다른 인수로 호출해야합니다 . – Rakete1111

+0

나는 좀 더 일반적인 대답을하려고 노력했지만, 질문을보다 정확하게 일치하도록 업데이트했습니다. – IanPudney

+0

'(* this)()'도'this_val()'도 컴파일되지 않습니다. –

0

비 정적 멤버 함수 (모든 펑 포함

귀하의 경우에는
(*this)(args); 

, 당신이 작성해야) 포함하는 개체의 주소가 암시 적 인수로 필요합니다. 당신은 효과를 달성하기 위해 람다 함수를 사용할 수 있습니다 여기에

vector<vector<int> > threeSum(vector<int> & nums) 
{ 
    auto mysort = [this](int i, int j) { 
    return operator()(i, j); 
    }; 
    sort(nums.begin(), nums.end(), mysort); 
    ... 
} 

람다 기능 mysort가 포함 된 객체 (this)의 실행 시간 주소를 캡처를 지금하는 일 수있다, operator()에 암시 적 인수로 사용 std::sort에 의해 사용됩니다.

편집 :이 방법은 펑터뿐만 아니라 다른 멤버 함수에서도 작동합니다. 그러나 정렬을 위해 펑터 만 사용하려는 경우 (*this)sort의 세 번째 인수로 직접 제공하는 다른 대답이 약간 더 효율적일 수 있습니다.

관련 문제