#include <iostream>
#include <functional>
template<typename T, typename U>
class BinaryFunctor
{
public:
BinaryFunctor(U (*a)(T, T), U (*b)(T, T)): a_(a), b_(b) {}
bool operator()(T left, T right)
{
return a_(left, right) < b_(left, right);
}
private:
U (*a_)(T, T);
U (*b_)(T, T);
};
int plus(int l, int r) { return l + r; }
int minus(int l, int r) { return l - r; }
int main(int argc, char* argv[])
{
BinaryFunctor<int, int> f(plus, minus);
std::cout << f(1, 2) << std::endl;
std::cin.get();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CmNsYXNzIEJpbmFyeUZ1bmN0b3IKewpwdWJsaWM6CiAgICBCaW5hcnlGdW5jdG9yKFUgKCphKShULCBUKSwgVSAoKmIpKFQsIFQpKTogYV8oYSksIGJfKGIpIHt9CgoJYm9vbCBvcGVyYXRvcigpKFQgbGVmdCwgVCByaWdodCkKCXsKCQlyZXR1cm4gYV8obGVmdCwgcmlnaHQpIDwgYl8obGVmdCwgcmlnaHQpOwoJfQoKcHJpdmF0ZToKCVUgKCphXykoVCwgVCk7CglVICgqYl8pKFQsIFQpOwp9OwoKaW50IHBsdXMoaW50IGwsIGludCByKSB7IHJldHVybiBsICsgcjsgfQppbnQgbWludXMoaW50IGwsIGludCByKSB7IHJldHVybiBsIC0gcjsgfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKewoJQmluYXJ5RnVuY3RvcjxpbnQsIGludD4gZihwbHVzLCBtaW51cyk7CglzdGQ6OmNvdXQgPDwgZigxLCAyKSA8PCBzdGQ6OmVuZGw7CgoJc3RkOjpjaW4uZ2V0KCk7CglyZXR1cm4gMDsKfQ==