함수 객체 버전은 어떤 타입이라도 인수로 받을 수 있고, 불필요한 복제를 피하기 위해 퍼펙트 포워딩을 사용한다. 따라서 비교한 인수들을 복제하지 않고 이동하므로 함수 객체 버전이 더 빠를 것이다.
물론, 필요하다면 리스트를 정렬하는 조건자를 정의해서 함수 객체로 전달해도 된다. 그렇다고 항상 객체를 정의할 필요는 없다. 클래스에 operator>()만 정의하면 std::greater<>를 그대로 사용할 수 있다. 타입에 대해 기본 비교가 아니라 다른 방식으로 비교하고 싶을 때 함수 객체의 필요성이 생긴다. 예를 들어 names 리스트에 있는 원소들을 string 객체의 표준 비교, 보다-큰(greater-than)이 아니라 이니셜이 같은 문자열을 길이로 정렬하고 싶다고 해보자. 이럴 때는 클래스를 다음과 같이 정의해야 한다.
// 이니셜이 같을 때 길이로 문자열을 정렬한다 class my_greater { public: bool operator()(const std::string& s1, const std::string& s2) { if (s1[0] == s2[0]) return s1.length() > s2.length(); else return s1 > s2; } };
이렇게 정의한 my_greater 클래스로 names 컨테이너를 정렬하고 싶다고 하자.
names.sort(my_greater()); // my_greater를 사용해 정렬
이 코드를 실행한 뒤에 리스트는 다음과 같이 된다.
“Jules” “Janet” “Jane” “Jim” “Hannah” “Hugo” “Alan” “Ann”