如何创建<id,成员函数>的映射?

How to create a map of <id, member function>?

本文关键字:函数 成员 gt 映射 id 创建 何创建 lt      更新时间:2023-10-16

我有以下代码,其中我在其中创建指针的地图以成员函数。

class A {
 public:
  A() {
    m[0] = &A::F1;
    m[1] = &A::F2;
  }
  void F1(int v) { ... }
  void F2(int v) { ... }
  void O(int i, int v) {
     (*m[i])(v);
  }
 private:
  using func = void(A::*)(int);
  std::map<int, func> m;
};

但是" O"中有一个编译错误。在我的理解中," m [i]"是指向成员函数的指针,(*m [i](删除它,应调用相应的成员函数。但是它行不通。

  • 您能帮助解释吗?
  • 还有其他整洁的方法来创建成员函数的地图吗?

成员函数的指针仅包含指向该函数的指针,而不包含应调用其对象的指针。

您需要在对象上调用该成员函数:

(this->*m[i])(v);

另一种方法可以完成相同的方法(可以说比纯函数指针更容易读取(是std::function,示例:

class A {
public:
  A() { // implicit capture of this is deprecated in c++20
    m[0] = [this](int v) { F1(v); };
    m[1] = [this](int v) { F2(v); };
  }
  void F1(int v)        { std::cout << "F1: " << v; }
  void F2(int v)        { std::cout << "F2: " << v; }
  void O (int i, int v) { m[i](v);                  }
private:
  std::map<int, std::function<void(int)>> m;
};
int main() {
  A a;
  a.O(0, 5);
}