#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;
}