Без дополнительных ограничений это легко сделать с помощью std::map
или std::unordered_map
от std::string
до std::function<void()>
. В C ++ 11 вы можете использовать лямбда-выражения для ненавязчивого захвата объекта this
для вызова функций-членов.
class HandlerHandler
{
std::map<std::string, std::function<void()>> handlers;
void foo();
void bar();
void frobnicate();
HandlerHandler()
{
handlers["FOO"] = [this](){ foo(); };
handlers["BAR"] = [this](){ bar(); };
handlers["FROB"] = [this](){ frobnicate(); };
}
void handle(std::string h)
{
handlers[h]();
}
};
https://godbolt.org/z/nbygdF
Возможно, вы захотите защититься от делаh
отсутствует на карте (в настоящее время он выдает исключение при попытке вызвать функцию, созданную по умолчанию).