#include <iostream>
#include <functional>
std::function< double( double, double ) > mult =
[]( double x, double y){return x*y;};
std::function< std::function< double(double) >(std::function< double(double, double) >, double) > funcYgivenX
= [](std::function< double(double, double) > func2d, double inX)
{
return [func2d, inX]( double inY ){ std::cout << "x: " << inX << ", y: " << inY << std::endl; return func2d(inX, inY); };
};
int main()
{
auto x = funcYgivenX(mult, 10);
auto y = x(20);
std::cout << "y: " << y << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnN0ZDo6ZnVuY3Rpb248IGRvdWJsZSggZG91YmxlLCBkb3VibGUgKSA+ICBtdWx0ID0gCltdKCBkb3VibGUgeCwgZG91YmxlIHkpe3JldHVybiB4Knk7fTsKCnN0ZDo6ZnVuY3Rpb248IHN0ZDo6ZnVuY3Rpb248IGRvdWJsZShkb3VibGUpID4oc3RkOjpmdW5jdGlvbjwgZG91YmxlKGRvdWJsZSwgZG91YmxlKSA+LCBkb3VibGUpID4gZnVuY1lnaXZlblgKICA9IFtdKHN0ZDo6ZnVuY3Rpb248IGRvdWJsZShkb3VibGUsIGRvdWJsZSkgPiBmdW5jMmQsIGRvdWJsZSBpblgpCiAgewogICAgcmV0dXJuIFtmdW5jMmQsIGluWF0oIGRvdWJsZSBpblkgKXsgc3RkOjpjb3V0IDw8ICJ4OiAiIDw8IGluWCA8PCAiLCB5OiAiIDw8IGluWSA8PCBzdGQ6OmVuZGw7IHJldHVybiBmdW5jMmQoaW5YLCBpblkpOyB9OwogIH07CgppbnQgbWFpbigpCnsKICAgYXV0byB4ID0gZnVuY1lnaXZlblgobXVsdCwgMTApOwogICBhdXRvIHkgPSB4KDIwKTsKICAgc3RkOjpjb3V0IDw8ICJ5OiAiIDw8IHkgPDwgc3RkOjplbmRsOwoKICAgcmV0dXJuIDA7Cn0KCg==