Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将成员函数作为多个类的参数_C++_Oop_Member Function Pointers - Fatal编程技术网

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

C++ 将成员函数作为多个类的参数,c++,oop,member-function-pointers,C++,Oop,Member Function Pointers,我正在研究输入系统。在这个系统中,当按下某个键时,对象可以注册一个要调用的函数。但是,注册的方法是该对象的成员,因此我的注册函数必须如下所示: class MyCallback { public: virtual void run(int abc) { cout << "MyCallback::run(" << abc << ")" << endl; } }; 无效寄存器(EventType类型,类

我正在研究输入系统。在这个系统中,当按下某个键时,对象可以注册一个要调用的函数。但是,注册的方法是该对象的成员,因此我的注册函数必须如下所示:

class MyCallback {
    public:
    virtual void run(int abc)
    {
        cout << "MyCallback::run(" << abc << ")" << endl;
    }
};
无效寄存器(EventType类型,类*对象,无效(类::*函数)(){ //保存这个 }


问题是,注册函数的类并不总是同一个类,所以这不起作用。还有其他方法吗?

您可以在注册回调的类中存储
std::function
,然后添加函数模板
register
成员函数:

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

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

class MyCallback {
    public:
    virtual void run(int abc)
    {
        cout << "MyCallback::run(" << abc << ")" << endl;
    }
};
调用所有观察者的类:

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);
        }

    }

};

模板。创建一个带有模板化子类的基回调类。对该函数的调用是什么样的?我认为F&&是一个函数指针。@handuel
F&&
是一种模板技术,它使用引用折叠来处理左值或右值引用。你不必太担心那件事。我添加了一个小示例。我在上也写过类似的东西。@handuel注意,这需要C++11,但是如果您没有编译器支持,那么您可以使用
boost
(除了
&&
的东西)执行几乎相同的操作。您知道这是否适用于g++?调用编译器时,是否必须使用命令行参数来告诉它使用哪种标准?@handuel这取决于版本。我不确定你需要什么版本的所有功能,但我觉得4.6应该足够了。
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);
}