#include <iostream>
#include <functional>
using namespace std;
function<void()>* preparatory_work() {
auto l = [](){ cout<< "My lambda is fine !" <<endl; } ; // lambda
function<void ()> f = l; // functor
auto p = new function<void()>(l); // a functor on the heap
l(); // inovke the lambda object
f(); // invoke the functor
(*p)(); // invoke functor via a pointer
return p;
}
int main() {
auto fcp = preparatory_work();
(*fcp)();
void *x = (void*)fcp;
(*(function<void()>*)x)();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4gCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKCmZ1bmN0aW9uPHZvaWQoKT4qIHByZXBhcmF0b3J5X3dvcmsoKSB7CiAgICBhdXRvIGwgPSBbXSgpeyBjb3V0PDwgIk15IGxhbWJkYSBpcyBmaW5lICEiIDw8ZW5kbDsgfSA7ICAvLyBsYW1iZGEgCiAgICBmdW5jdGlvbjx2b2lkICgpPiBmID0gbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdG9yCiAgICBhdXRvIHAgPSBuZXcgZnVuY3Rpb248dm9pZCgpPihsKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGZ1bmN0b3Igb24gdGhlIGhlYXAKCQogICAgbCgpOyAgLy8gaW5vdmtlIHRoZSBsYW1iZGEgb2JqZWN0IAogICAgZigpOyAgLy8gaW52b2tlIHRoZSBmdW5jdG9yIAogICAgKCpwKSgpOyAvLyBpbnZva2UgZnVuY3RvciB2aWEgYSBwb2ludGVyIAoKICAgIHJldHVybiBwOyAKfQoKaW50IG1haW4oKSB7CiAgICBhdXRvIGZjcCA9IHByZXBhcmF0b3J5X3dvcmsoKTsKICAgICgqZmNwKSgpOwogICAgdm9pZCAqeCA9ICh2b2lkKilmY3A7IAogICAgKCooZnVuY3Rpb248dm9pZCgpPiopeCkoKTsgCiAgICAKfQ==