C ++-将对象(如字符串)映射到表中的成员函数的正确方法

Bob*_*Bob 3 c++ member-function-pointers function-pointers functor c++11

我正在处理由第三方API定义的事件。这些事件由字符串标识符标识,即"EventABC"

我需要将表中的这些(字符串)事件映射到对象的成员函数。

最安全,最干净的方法是什么?

Max*_*hof 7

在没有其他限制的情况下,可以使用std::mapstd::unordered_mapstd::string到轻松完成此操作std::function<void()>。使用C ++ 11,您可以使用lambda轻松地捕获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]();
    }
};
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/nbygdF

您可能要防止h在映射中不存在的情况(当前,当它尝试调用默认构造的函数时,它将抛出异常)。