enum ComparisonResult { less = -1, equal = 0, greater = 1 }; template class CompareChain : std::binary_function { typedef boost::function CompareFunctor; public: CompareChain( const CompareFunctor& f1 ) { functions.push_back( f1 ); } CompareChain( const CompareFunctor& f1, const CompareFunctor& f2 ) { functions.push_back( f1 ); functions.push_back( f2 ); } CompareChain( const CompareFunctor& f1, const CompareFunctor& f2, const CompareFunctor& f3 ) { functions.push_back( f1 ); functions.push_back( f2 ); functions.push_back( f3 ); } bool operator()( const T& lhs, const T& rhs ) const { BOOST_FOREACH( CompareFunctor f, functions ) { switch( f( lhs, rhs ) ) { case less: return true; case greater: return false; } } return false; } private: std::vector functions; };