我有以下代码,在其中创建了指向成员函数的指针的映射。
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])取消引用它,并应调用相应的成员函数。但这行不通。
答案 0 :(得分:8)
指向成员函数的指针仅包含指向函数的指针,而不指向应在其上调用该对象的指针。
您需要在对象上调用该成员函数:
(this->*m[i])(v);
答案 1 :(得分:1)
可以完成此操作的另一种方法(可以说比普通函数指针更容易阅读)是使用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);
}