2010-12-15 4 views
3

이유는이 작업을 수행 할 수 있습니다사용하여 비교 함수

stable_sort(it1, it2, binary_function); 

하지만이 : 나는 첫 번째 경우에 함수를 사용할 수 있지만에서 개체를 필요로 할 수있는 이유

priority_queue<type, vector<type>, binary_function> pq; 

을 둘째?

답변

1

당신이 std::stable_sort의 참조를 선택하면, 당신은 당신이 제공하는 binary_function이 둘 사이의 차이가 어쩌면 두 번째 경우에는이 제외 없다 ...뿐만 아니라 함수 객체되어야한다고 볼 수 적절한 "캐스트"또는 함수에서 적절한 함수 오브젝트로의 변환.

나는 이것이 *sort 함수가 직접 functor를 사용하고, 즉, *sort 함수가 호출 될 때 함수 주소가 유효하면 함수 호출 기간 동안 유효하다는 사실에 기인한다고 생각한다. 이것을 데이터 멤버 (본질적으로)로 사용하는 컨테이너를 생성 할 때 컨테이너 객체의 수명 동안 함수 참조가 무효화 될지 확신 할 수 없습니다. 나는 그것이 느슨한 handwaving 설명이지만, 내가 생각해내는 것이 가장 좋습니다. 아마도 C++에서 이진 함수에 대한 참조는 암시 적으로 std::function 구성으로 변환되어 함수가 "복사"되고 유효성 문제가 발생하지 않습니다. 내가 지금 당신을 잃었하지 않은 희망

...

+0

첫 번째 경우 'binary_function'은 함수 객체의 인스턴스 이름 또는 함수 이름입니다. 따라서 템플릿 매개 변수가 유형 이름 (변수/함수 이름 아님)이어야하는 두 번째 경우에는 사용할 수 없습니다. – visitor

+0

그럼에도 불구하고 함수 객체는 클래스입니다. 맞습니까? 'bool operator (arg)'를 가진 구조체와 같은 것. 그렇지 않으면 함수의 주소 일 뿐이며,이 경우에는 사용할 수 없습니다.이 참조는 평생 발급되지 않습니다. – rubenvb

+0

이 클래스의 클래스와 인스턴스 간에는 차이점이 있습니다. 'MyFunctor fun; -'MyFunctor'는 클래스의 이름이고'fun'는 인스턴스의 이름입니다. 'stable_sort'는'fun' (인수의 유형을 추론)를 취하고 priority_queue의 템플릿 인수는'MyFunctor'를 사용합니다. – UncleBens

3

priority_queue 템플릿이며 binary_function는 함수 객체이다 인수로 유형을 기대하고있다.

+0

정밀도 : C++ 0x에서'decltype'을 사용하여 객체에서 유형을 검색 할 수있었습니다 (정적으로) –