繁体   English   中英

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

[英]C++ - proper way to map objects (like strings) to member functions in table

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

我需要 map 表中的这些(字符串)事件到 object 的成员函数。

问题

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

没有进一步的限制,这很容易通过std::mapstd::unordered_mapstd::stringstd::function<void()>完成。 使用 C++11,您可以使用 lambdas 不显眼地捕获this object 以调用成员函数。

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

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

可以执行以下操作,将方法包装在 std::function

#include <iostream>
#include <string>
#include <functional>
#include <map>

struct Target
{
    void member1() {
        std::cout << "member1\n";
    }

    void member2() {
        std::cout << "member2\n";
    }
};


int main()
{   
   // events will be called on this object
   Target myTarget; 

   std::map<std::string, std::function<void(void)>> table;
   table.insert({"member1", std::bind(&Target::member1, &myTarget)});
   table.insert({"member2", std::bind(&Target::member2, &myTarget)});

   std::string event = "member2";
   table[event]();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM