将成员函数作为多个类的参数

Take member functions as parameters from multiple classes

本文关键字:参数 成员 函数      更新时间:2023-10-16

我正在开发一个输入系统。在这个系统中,当按下某个键时,对象可以注册要调用的函数。然而,注册的方法是该对象的成员,所以我的注册函数必须看起来像这样:

void寄存器(EventType类型,Class*对象,void(Class::*函数)()){//保存这个}

问题是,它不会总是同一个类注册一个函数,所以这不起作用。这周围有没有?

您可以将std::function<void()>存储在注册回调的类中,然后添加一个函数模板register成员函数:

struct Foo
{
  template <typename F>
  void register(EventType type, F&& fun)
  {
    // make an std::function<void()> from fun and store
  }
};

然后,在调用方一侧绑定Class实例和Class成员函数。

struct Bar { void bar() {} };
void foobar() { std::cout << "foobar!n"; }
Foo f;
Bar b;
f.register(event1, std::bind(&Bar::bar, b)); // will call b.bar()
f.register(event2, foobar);                  // will call foobar()

这是一种不用模板和函数指针的方法。您有一个观察者(回调)类,如下所示:

class MyCallback {
    public:
    virtual void run(int abc)
    {
        cout << "MyCallback::run(" << abc << ")" << endl;
    }
};

然后用父类MyCallback:实例化观察者类

class Test : public MyCallback
{
    public:
    void run(int abc)
    {
        MyCallback::run(abc);
    }
};

调用所有观察者的类:

class Subject
{
    vector<MyCallback*> observers;
    public:
    void reg_observer(MyCallback* cb)
    {
        observers.push_back(cb);
    }
    void call_out(int abc)
    {
        vector<MyCallback*>::iterator it;
        for(it=observers.begin();it!=observers.end();it++)
        {
            (*it)->run(abc);
        }
    }
};

测试代码:

void testcb()
{
    Test ttt;
    Subject s;
    s.reg_observer(&ttt);
    s.call_out(123);
}