内部構造を知らないとかけないコンパレータは内部に書くのが普通。
外部から与えるコンパレータが内部構造に依存するのは道理としておかしい

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Foo {
  int a, b;
public:
  Foo(int a, int b) : a(a), b(b) { }
  bool operator < (const Foo& o) const { return cmp_ab(*this, o); }
  static bool cmp_ab(const Foo &lhs, const Foo &rhs) { 
    return lhs.a != rhs.a ? lhs.a < rhs.a : lhs.b < rhs.b; }
  static bool cmp_ba(const Foo &lhs, const Foo &rhs) { 
    return lhs.b != rhs.b ? lhs.b < rhs.b : lhs.a < rhs.a; }
};
int main() {
  vector<Foo> v;
  v.push_back(Foo(0,2));v.push_back(Foo(1,1));v.push_back(Foo(2,0));
  sort(v.begin(), v.end(), Foo::cmp_ab);
  sort(v.begin(), v.end(), Foo::cmp_ba);
}