#include <iostream>
#include <map>
#include <functional>
typedef std::map<int,std::function<void()>> ProcessMessageMap;
void print_hi()
{
std::cout<<"hi"<<std::endl;
}
void print_bye()
{
std::cout<<"bye"<<std::endl;
}
enum Message
{
SAY_HI = 0,
SAY_BYE,
DONT_DO_ANYTHING
} messages;
void process_message( const ProcessMessageMap &m, Message msg )
{
auto i = m.find(msg);
if(i != m.end())
{
(i->second)();
}
}
void setup_map( ProcessMessageMap &m )
{
m[SAY_HI] = std::bind(print_hi);;
m[SAY_BYE] = std::bind(print_bye);
}
int main()
{
ProcessMessageMap msg_map;
setup_map( msg_map );
process_message( msg_map, SAY_HI );
process_message( msg_map, SAY_BYE );
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnR5cGVkZWYgc3RkOjptYXA8aW50LHN0ZDo6ZnVuY3Rpb248dm9pZCgpPj4gUHJvY2Vzc01lc3NhZ2VNYXA7Cgp2b2lkIHByaW50X2hpKCkKewogIHN0ZDo6Y291dDw8ImhpIjw8c3RkOjplbmRsOwp9Cgp2b2lkIHByaW50X2J5ZSgpCnsKICBzdGQ6OmNvdXQ8PCJieWUiPDxzdGQ6OmVuZGw7Cn0KCgplbnVtIE1lc3NhZ2UKewogIFNBWV9ISSA9IDAsCiAgU0FZX0JZRSwKICBET05UX0RPX0FOWVRISU5HCn0gbWVzc2FnZXM7Cgp2b2lkIHByb2Nlc3NfbWVzc2FnZSggY29uc3QgUHJvY2Vzc01lc3NhZ2VNYXAgJm0sIE1lc3NhZ2UgbXNnICkKewogICAgYXV0byBpID0gbS5maW5kKG1zZyk7CiAgICBpZihpICE9IG0uZW5kKCkpCiAgICB7CgkoaS0+c2Vjb25kKSgpOwogICAgfQp9Cgp2b2lkIHNldHVwX21hcCggUHJvY2Vzc01lc3NhZ2VNYXAgJm0gKQp7CiAgICBtW1NBWV9ISV0gPSBzdGQ6OmJpbmQocHJpbnRfaGkpOzsKICAgIG1bU0FZX0JZRV0gPSBzdGQ6OmJpbmQocHJpbnRfYnllKTsKfQoKaW50IG1haW4oKQp7CiAgICBQcm9jZXNzTWVzc2FnZU1hcCBtc2dfbWFwOwogICAgc2V0dXBfbWFwKCBtc2dfbWFwICk7CiAgICBwcm9jZXNzX21lc3NhZ2UoIG1zZ19tYXAsIFNBWV9ISSApOwogICAgcHJvY2Vzc19tZXNzYWdlKCBtc2dfbWFwLCBTQVlfQllFICk7CiAgICByZXR1cm4gMDsKfQ==