#include <vector>
#include <iostream>
#include <functional>
enum Direction
{
UP,
DOWN
};
struct Control{
char key;
std::function<void()> press;
std::function<void()> release;
Control(char key, std::function<void()> press, std::function<void()> release):
key(key),press(press),release(release){}
};
struct Player
{
void go(Direction)
{
std::cout << "go\n";
}
void stop(Direction)
{
std::cout << "stop\n";
}
};
struct Screen
{
void init(Player& player);
void update();
std::vector<Control> controls;
};
void Screen::init(Player& player){
/*this->controls.push_back(Control(
'W',
[&player](){player.go(UP);},
[&player](){player.stop(UP);}));*/
this->controls.emplace_back(
'W',
[&player](){player.go(UP);},
[&player](){player.stop(UP);});
}
void Screen::update(){
for (auto control : controls){
control.press();
control.release();
}
}
int main()
{
Player p;
Screen s;
s.init(p);
s.update();
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCmVudW0gRGlyZWN0aW9uCnsKICAgIFVQLAoJRE9XTgp9OwoKc3RydWN0IENvbnRyb2x7CiAgICBjaGFyIGtleTsKICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBwcmVzczsKICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiByZWxlYXNlOwogICAgQ29udHJvbChjaGFyIGtleSwgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHByZXNzLCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gcmVsZWFzZSk6CiAgICAgICAga2V5KGtleSkscHJlc3MocHJlc3MpLHJlbGVhc2UocmVsZWFzZSl7fQp9OwoKc3RydWN0IFBsYXllcgp7Cgl2b2lkIGdvKERpcmVjdGlvbikKCXsKCQlzdGQ6OmNvdXQgPDwgImdvXG4iOwoJfQoKCXZvaWQgc3RvcChEaXJlY3Rpb24pCgl7CgkJc3RkOjpjb3V0IDw8ICJzdG9wXG4iOwoJfQp9OwoKc3RydWN0IFNjcmVlbgp7Cgl2b2lkIGluaXQoUGxheWVyJiBwbGF5ZXIpOwoJdm9pZCB1cGRhdGUoKTsKCglzdGQ6OnZlY3RvcjxDb250cm9sPiBjb250cm9sczsKfTsKCnZvaWQgU2NyZWVuOjppbml0KFBsYXllciYgcGxheWVyKXsKCiAgICAvKnRoaXMtPmNvbnRyb2xzLnB1c2hfYmFjayhDb250cm9sKAogICAgICAgICdXJywKICAgICAgICBbJnBsYXllcl0oKXtwbGF5ZXIuZ28oVVApO30sCiAgICAgICAgWyZwbGF5ZXJdKCl7cGxheWVyLnN0b3AoVVApO30pKTsqLwogICAgICAgIAogICAgICAgIHRoaXMtPmNvbnRyb2xzLmVtcGxhY2VfYmFjaygKICAgICAgICAnVycsCiAgICAgICAgWyZwbGF5ZXJdKCl7cGxheWVyLmdvKFVQKTt9LAogICAgICAgIFsmcGxheWVyXSgpe3BsYXllci5zdG9wKFVQKTt9KTsKICAgICAgICAKCn0KCnZvaWQgU2NyZWVuOjp1cGRhdGUoKXsKICAgIGZvciAoYXV0byBjb250cm9sIDogY29udHJvbHMpewogICAgICAgICAgICBjb250cm9sLnByZXNzKCk7CiAgICAgICAgICAgIGNvbnRyb2wucmVsZWFzZSgpOwogICAgfQp9CgppbnQgbWFpbigpCnsKCVBsYXllciBwOwoJU2NyZWVuIHM7CglzLmluaXQocCk7CglzLnVwZGF0ZSgpOwp9Cg==