插入成员函数指针的映射

Fat*_*sis 3 c++

我的问题有点复杂,所以我将从一个例子开始:

class a
{
public:
     a()
     {
          pointerMap.insert(pair<std::string, void a::*(int, int)> ("func1", func1);
          pointerMap.insert(pair<std::string, void a::*(int, int)> ("func2", func2);
     }

private:
     void func1(int a, int b);
     void func2(int a, int b);
     std::map<std::string, void a::* (int, int)> pointerMap;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,这是将成员函数的指针添加到对象中的映射的正确方法,以便您只引用单个实例func1func2

而且,我不知道如何从指针调用此函数.它会是这样的吗?

map["func1"](2,4);
Run Code Online (Sandbox Code Playgroud)

在使用成员函数时,我对语法有点困惑.

Rob*_*obᵩ 7

一,代码:

#include <map>
#include <string>
class a
{
public:
     a()
     {
       pointerMap["func1"] = &a::func1;
       pointerMap["func2"] = &a::func2;
     }

     void invoke(const std::string& name, int x, int y) {
       if(pointerMap[name])
         (this->*pointerMap[name])(x, y);
     }

private:
     void func1(int a, int b) {};
     void func2(int a, int b) {};
     std::map<std::string, void (a::*)(int, int)> pointerMap;
};

int main () {
  a o;
  o.invoke("func1", 1, 2);
}
Run Code Online (Sandbox Code Playgroud)

现在,针对您的问题:

我的问题是,这是将成员函数的指针添加到对象内的地图的正确方法

我发现下标运算符[]比你正在进行的插入更容易阅读.

这样您只能引用单个实例的func1或func2.

指向成员函数的指针没有与之关联的实例.在调用实例时将指针绑定到实例.因此,您的地图可能就像一个静态成员一样容易.

我将如何从指针调用此函数.

语法是:(instance.*pointer)(args)(class_pointer->*pointer)(args).既然你没有说出应该调用哪些函数,我就假设了this.你的指针存在地图中,所以我们有:

((this)->*(this->pointerMap["func1"]))(arg1, arg2)
Run Code Online (Sandbox Code Playgroud)

要么

(this->*pointerMap[name])(x, y);
Run Code Online (Sandbox Code Playgroud)