Call Function by string

unordered_map을 이용해 구현한다.
unordered_map Key 값은 문자열로, unordered_map의 Value는 std::function이다.

#include <iostream>
#include <unordered_map>
#include <string>
#include <functional>

using  namespace  std::placeholders;
typedef std::unordered_map<std::string, std::function<bool(int)>> EventMap;

struct Car
{
    int ShowPrice(int money)
    {
        std::cout << "Car Price: " << money << std::endl;
        return 0;
    }

    int ShowLowPrice(int money)
    {
        std::cout << "Car Low Price: " << money << std::endl;
        return 0;
    }
};


struct Food
{
    int ShowPrice(int money)
    {
        std::cout << "Food Price: " << money << std::endl;
        return 0;
    }

    int ShowLowPrice(int money)
    {
        std::cout << "Food Low Price: " << money << std::endl;
        return 0;
    }
};

void DisplayAll(int step, EventMap& eventMap)
{
    std::cout << "------------------------------ " << step << ". Result" << std::endl;
    for (EventMap::const_iterator it = eventMap.begin(); it != eventMap.end(); ++it)
        it->second(100);
}

int main(int argc, const char * argv[])
{
    EventMap eventMap;

    Car car;
    Food food;
    
    eventMap.insert(EventMap::value_type("car", std::bind(&Car::ShowPrice, &car, _1)));
    eventMap["lowcar"] = std::bind(&Car::ShowLowPrice, &car, _1);
    eventMap["food"] = std::bind(&Food::ShowPrice, &food, _1);
    eventMap["lowfood"] = std::bind(&Food::ShowLowPrice, &food, _1);

    DisplayAll(1, eventMap);



    if (eventMap.erase("lowfood") == 1)
    {
        DisplayAll(2, eventMap);
    }

    // add a value and reinspect
    EventMap::key_type key = "newlowfood";
    EventMap::mapped_type mapped = std::bind(&Food::ShowLowPrice, &food, _1);
    EventMap::value_type val = EventMap::value_type(key, mapped);
    eventMap.insert(val);

    std::cout << "------------------------------ 3. Result" << std::endl;
    EventMap::iterator iter = eventMap.find("newlowfood");
    if (iter != eventMap.end())
        iter->second(10);

    return 0;
}

typedef std::unordered_map<std::string, std::function<bool(int)>> EventMap;

std::function의 return 값은 bool이고, 인수는  int이다.

아래는 Food와 Car의 메소드를 eventMap에 추가하고 있다.

eventMap.insert(EventMap::value_type("car", std::bind(&Car::ShowPrice, &car, _1)));
eventMap["lowcar"] = std::bind(&Car::ShowLowPrice, &car, _1);
eventMap["food"] = std::bind(&Food::ShowPrice, &food, _1);
eventMap["lowfood"] = std::bind(&Food::ShowLowPrice, &food, _1);

삭제하는 방법은 다음과 같다.
성공하면 1을 리턴하고, 실패하면  0을 리턴한다.

int ret = eventMap.erase("lowfood");

검색후 실행은 다음과 같다.

EventMap::iterator iter = eventMap.find("newlowfood");
if (iter != eventMap.end())
      iter->second(10);

참조)
http://code-algalon.tistory.com/22