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

C++ C++;-将对象(如字符串)映射到表中成员函数的正确方法,c++,c++11,function-pointers,functor,member-function-pointers,C++,C++11,Function Pointers,Functor,Member Function Pointers,我正在处理由第三方API定义的事件。 事件由字符串标识符标识,即“EventABC” 我需要将表中的这些(字符串)事件映射到对象的成员函数 问题 最安全、最干净的方法是什么?可以执行如下操作,将方法包装在std::function中 #include <iostream> #include <string> #include <functional> #include <map> struct Target { void member1(

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

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

问题


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

可以执行如下操作,将方法包装在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]();
}
#包括
#包括
#包括
#包括
结构目标
{
无效成员1(){

std::cout无需进一步的约束,这可以通过
std::map
std::unordered_map
std::string
std::function
轻松实现。使用C++11,您可以使用lambdas不引人注目地捕获
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]();
    }
};
类HandlerHandler
{
映射处理程序;
void foo();
空心钢筋();
无效泡沫();
HandlerHandler()
{
处理程序[“FOO”]=[this](){FOO();};
处理程序[“BAR”]=[this](){BAR();};
处理程序[“FROB”]=[this](){frobnite();};
}
无效句柄(标准::字符串h)
{
处理程序[h]();
}
};


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

您如何知道要在哪个对象上调用这些成员函数?或者对于对象的每个实例,该映射是否应该不同?我猜
std::mem\u-fun()
虽然我从未使用过它,但我总是使用一个包含
std::function
的表,其中填充了lambda,这些lambda捕获了它们的
this
指针。@MaxLanghof只有一个对象。它包含所有处理程序。映射将与只有一个实例相同。