如何将成员函数作为参数传递并在派生对象上执行方法列表

How to pass a member function as a parameter and execute list of methods on derived object

我想创建一个将整数值映射到成员函数的数组,以便

(this->*actionMap[i])();

执行方法。为了填充数组,我想要一个将数组元素设置为相应操作的方法。

我在之前的问题中看到它应该使用 std::function 和 std::bind 但我没有遵循语法,我不明白如何声明数组:

这是M(非)WE 请注意,我希望基 class 能够在派生对象上执行方法。

#include <iostream>
using namespace std;
class Base;
typedef void (Base::*Action)();

class Base {
    Action actions[3];
public:
    void setAction(int a, Action act) {
        actions[a] = act;
    }
    void f() { cout << "f"; }
    void go() {
        for (int i = 0;  i < 3; i++)
            (this->*actions[i])();
    }
};

struct Derived : public Base {
    void g() { cout << "g"; }
    void h() { cout << "h"; }
    Derived() {
        setAction(1, f);
        setAction(2, g);
        setAction(1, h);
    }
};

int main() {
    Derived d;
    d.go();
}

execute methods on the derived object.

所以当你执行这些方法时,你必须有一个派生对象的句柄。其中两个方法不在 Base:: 中,因为它们不在 Base 中。它们在 Derived 内,因此指针可能是 Derived::*,但这没有任何意义,并且会破坏我猜你想要的模型。我想你可以让你的方法 g hfBase 中是虚拟的。但这又会破坏目的,我猜这是一种类似于观察者的模式。

你想做的事情,基本上很容易通过适当的抽象来解决 - std::functionstd::bind.

#include <iostream>
#include <array>
#include <functional>

class Base {
    std::array<std::function<void()>, 3> actions;
public:
    void setAction(int a, std::function<void()> act) {
        actions.at(a) = act;
    }
    void f() { std::cout << "f"; }
    void go() {
        for (auto&& action : actions) {
            if (action) {
                action();
            }  
        }
    }
};

struct Derived : public Base {
    void g() { std::cout << "g"; }
    void h() { std::cout << "h"; }
    Derived() {
        setAction(1, std::bind(&Derived::f, this));
        setAction(2, std::bind(&Derived::g, this));
        setAction(1, std::bind(&Derived::h, this));
    }
};

int main() {
    Derived d;
    d.go();
}