#include <iostream>
#include <functional>
 
class Window
{
public:
    void ProcessMessage(std::function<int()> create, std::function<int()> update)
    {
        create();
        update();
    }
};
 
class App
{
private:
    Window win;
 
private:
    int OnUserCreate()
    {
		std::cout << "OnUserCreate() called" << std::endl;
        return 1;
    }
 
    int OnUserUpdate()
    {
		std::cout << "OnUserUpdate() called" << std::endl;
        return 1;
    }
 
public:
    void Run()
    {
        win.ProcessMessage(
        	std::bind(&App::OnUserCreate, this),
        	std::bind(&App::OnUserUpdate, this)
        );
    }
};
 
int main()
{
    App app;
    //while (true)
    {
        app.Run();
    }
}
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCmNsYXNzIFdpbmRvdwp7CnB1YmxpYzoKICAgIHZvaWQgUHJvY2Vzc01lc3NhZ2Uoc3RkOjpmdW5jdGlvbjxpbnQoKT4gY3JlYXRlLCBzdGQ6OmZ1bmN0aW9uPGludCgpPiB1cGRhdGUpCiAgICB7CiAgICAgICAgY3JlYXRlKCk7CiAgICAgICAgdXBkYXRlKCk7CiAgICB9Cn07CgpjbGFzcyBBcHAKewpwcml2YXRlOgogICAgV2luZG93IHdpbjsKCnByaXZhdGU6CiAgICBpbnQgT25Vc2VyQ3JlYXRlKCkKICAgIHsKCQlzdGQ6OmNvdXQgPDwgIk9uVXNlckNyZWF0ZSgpIGNhbGxlZCIgPDwgc3RkOjplbmRsOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIGludCBPblVzZXJVcGRhdGUoKQogICAgewoJCXN0ZDo6Y291dCA8PCAiT25Vc2VyVXBkYXRlKCkgY2FsbGVkIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgpwdWJsaWM6CiAgICB2b2lkIFJ1bigpCiAgICB7CiAgICAgICAgd2luLlByb2Nlc3NNZXNzYWdlKAogICAgICAgIAlzdGQ6OmJpbmQoJkFwcDo6T25Vc2VyQ3JlYXRlLCB0aGlzKSwKICAgICAgICAJc3RkOjpiaW5kKCZBcHA6Ok9uVXNlclVwZGF0ZSwgdGhpcykKICAgICAgICApOwogICAgfQp9OwoKaW50IG1haW4oKQp7CiAgICBBcHAgYXBwOwogICAgLy93aGlsZSAodHJ1ZSkKICAgIHsKICAgICAgICBhcHAuUnVuKCk7CiAgICB9Cn0=