#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==