#include <iostream>
#include <list>
#include <functional>
#include <algorithm>

using namespace std;

#if ((defined __GNUC__) && (__GNUC_MINOR__ > 91)) || (!defined __GNUC__)
namespace std {
#endif

template <class Arg1, class Arg2, class Result>
struct binary_function<Arg1&, Arg2, Result> {
    typedef Arg1 first_argument_type;
    typedef Arg2 second_argument_type;
    typedef Result result_type;
};      

template <class Arg1, class Arg2, class Result>
struct binary_function<Arg1, Arg2&, Result> {
    typedef Arg1 first_argument_type;
    typedef Arg2 second_argument_type;
    typedef Result result_type;
};      

template <class Arg1, class Arg2, class Result>
struct binary_function<Arg1&, Arg2&, Result> {
    typedef Arg1 first_argument_type;
    typedef Arg2 second_argument_type;
    typedef Result result_type;
};      

#if ((defined __GNUC__) && (__GNUC_MINOR__ > 91)) || (!defined __GNUC__)
} // namespace std
#endif

struct Record {
  Record(const char*) {}
  Record(int) {}
};

bool name_key_eq(const Record&, const Record) { return true; }
bool ssn_key_eq(const Record, const Record&) { return false; }
bool float_key_eq(const Record&, const Record&) { return false; }

void f(list<Record> lr) {
  typedef list<Record>::iterator LI;
  LI p = find_if(lr.begin(), lr.end(), bind2nd(ptr_fun(name_key_eq), "FOO"));
  LI q = find_if(lr.begin(), lr.end(), bind2nd(ptr_fun(ssn_key_eq), 123456));
  LI r = find_if(lr.begin(), lr.end(), bind2nd(ptr_fun(float_key_eq), 12.3));
}

int main() {
  list<Record> lr;
  f(lr);

  return 0;
}
