#include <functional>
#include <iostream>
struct foo
{
int _a;
foo(int a) : _a(a) {}
int operator()(int b) { return _a+b; }
};
class bar
{
public:
std::function<int (int)> _ftor;
bar(std::function<int (int)> my_ftor) : _ftor(my_ftor) {}
~bar() {}
};
void AnyFunction(bar& RefToBar)
{
int y = RefToBar._ftor(25);
std::cout << "Y: " << y << std::endl;
}
int AnotherFunction(int b)
{
return b + 11;
}
int main(int argc, char const *argv[])
{
foo MyFoo(20);
bar MyBar(MyFoo);
bar MyBar_2(AnotherFunction);
bar MyBar_3([](int b) { return b + 56; });
AnyFunction(MyBar);
AnyFunction(MyBar_2);
AnyFunction(MyBar_3);
return 0;
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnN0cnVjdCBmb28KewogICAgaW50IF9hOwogICAgZm9vKGludCBhKSA6IF9hKGEpIHt9CiAgICBpbnQgb3BlcmF0b3IoKShpbnQgYikgeyByZXR1cm4gX2ErYjsgfQp9OwoKCmNsYXNzIGJhcgp7ICAgICAgICAKcHVibGljOgogICAgc3RkOjpmdW5jdGlvbjxpbnQgKGludCk+IF9mdG9yOwoKICAgIGJhcihzdGQ6OmZ1bmN0aW9uPGludCAoaW50KT4gbXlfZnRvcikgOiBfZnRvcihteV9mdG9yKSB7fQogICAgfmJhcigpIHt9Cn07Cgp2b2lkIEFueUZ1bmN0aW9uKGJhciYgUmVmVG9CYXIpCnsKICAgIGludCB5ID0gUmVmVG9CYXIuX2Z0b3IoMjUpOwogICAgc3RkOjpjb3V0IDw8ICJZOiAiIDw8IHkgPDwgc3RkOjplbmRsOwp9CgppbnQgQW5vdGhlckZ1bmN0aW9uKGludCBiKQp7CglyZXR1cm4gYiArIDExOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciBjb25zdCAqYXJndltdKQp7Cglmb28gTXlGb28oMjApOwoJYmFyIE15QmFyKE15Rm9vKTsKCWJhciBNeUJhcl8yKEFub3RoZXJGdW5jdGlvbik7CgliYXIgTXlCYXJfMyhbXShpbnQgYikgeyByZXR1cm4gYiArIDU2OyB9KTsKCgoJQW55RnVuY3Rpb24oTXlCYXIpOwoJQW55RnVuY3Rpb24oTXlCYXJfMik7CglBbnlGdW5jdGlvbihNeUJhcl8zKTsKCXJldHVybiAwOwp9Cg==