#include <iostream>
#include <functional>
template<typename T, typename U>
class BinaryFunctor
{
public:
BinaryFunctor(std::function<U(T,T)> a, std::function<U(T,T)> b): a_(a), b_(b) {}
bool operator()(T left, T right)
{
return a_(left, right) < b_(left, right);
}
private:
std::function<U(T,T)> a_;
std::function<U(T,T)> b_;
};
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+CmNsYXNzIEJpbmFyeUZ1bmN0b3IKewpwdWJsaWM6CiAgICBCaW5hcnlGdW5jdG9yKHN0ZDo6ZnVuY3Rpb248VShULFQpPiBhLCBzdGQ6OmZ1bmN0aW9uPFUoVCxUKT4gYik6IGFfKGEpLCBiXyhiKSB7fQoKCWJvb2wgb3BlcmF0b3IoKShUIGxlZnQsIFQgcmlnaHQpCgl7CgkJcmV0dXJuIGFfKGxlZnQsIHJpZ2h0KSA8IGJfKGxlZnQsIHJpZ2h0KTsKCX0KCnByaXZhdGU6CglzdGQ6OmZ1bmN0aW9uPFUoVCxUKT4gYV87CglzdGQ6OmZ1bmN0aW9uPFUoVCxUKT4gYl87Cn07CgppbnQgcGx1cyhpbnQgbCwgaW50IHIpIHsgcmV0dXJuIGwgKyByOyB9CmludCBtaW51cyhpbnQgbCwgaW50IHIpIHsgcmV0dXJuIGwgLSByOyB9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQp7CglCaW5hcnlGdW5jdG9yPGludCwgaW50PiBmKHBsdXMsIG1pbnVzKTsKCXN0ZDo6Y291dCA8PCBmKDEsIDIpIDw8IHN0ZDo6ZW5kbDsKCglzdGQ6OmNpbi5nZXQoKTsKCXJldHVybiAwOwp9