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

问题描述 投票:3回答:2

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

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

问题

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

c++ c++11 function-pointers functor member-function-pointers
2个回答
7
投票

[没有其他限制,这很容易用std::mapstd::unordered_mapstd::stringstd::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]();
    }
};

https://godbolt.org/z/nbygdF

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


1
投票

可以执行以下操作,将方法包装在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]();
}
© www.soinside.com 2019 - 2024. All rights reserved.