2011-10-28 3 views

답변

6

예, boost::bind 사용할 수 있습니다 : 그것은`연산자를 <정의 할 수있는 옵션

#include <iostream> 
#include <algorithm> 
#include <iterator> 
#include <boost/bind.hpp> 

struct S { 
    bool ascending; 
    bool Compare(int lhs, int rhs) { 
    return ascending ? (lhs < rhs) : (rhs < lhs); 
    } 
}; 

int main() { 

    int i[] = { 1, 3, 5, 7, 8, 6, 4, 2 }; 
    S s; 
    s.ascending = true; 
    std::sort(i, i+8, boost::bind(&S::Compare, &s, _1, _2)); 
    std::copy(i, i+8, std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << "\n"; 

    s.ascending = false; 
    std::sort(i, i+8, boost::bind(&S::Compare, &s, _1, _2)); 
    std::copy(i, i+8, std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << "\n"; 
} 
+0

이것은 받아 들여진 대답이어야합니다 ... 질문에 대답합니다 – sehe

+0

'& S :: Compare'에서'&'가 필요합니까? 나는 보통 그렇게하기에 잘못이 아니기 때문에 나는 보통 거기에 넣는다. 그러나 나는'&'없이 전달 된 함수 포인터의 예를 보았 기 때문에 궁금했다. – gred

+0

@gred - [경험적으로, 예] (http://ideone.com/bEkBd). 나는 표준에서 편리한 장과 절을 가지고 있지 않지만,'& S :: Compare'는 함수에 대한 포인터가 아니기 때문에 그럴 것이라고 생각한다. 그것은 완전히 다른 짐승 인 멤버 함수에 대한 포인터입니다. –

0

당신은 콜백으로 기능을 제공해야합니다

std::sort(list.begin(),list.end(),object::comparator) 

가정 함수가 이미 static, 나는 다른 문제가 표시되지 않습니다.

+0

정적으로 동의하지만 비 정적 방법은 어떻습니까? – Vik

+0

@Vik은 중복 가능성이있는 링크를 확인합니다. –