观察者模式中的回调函数注册和非静态函数注册

相关文章:C++中的观察者模式

1.关于回调函数传输的传递

在上文(C++中的观察者模式)中,采用了常用的void函数和空参数。

我们可以通过修改typedef void   (*EventHandler)(void);中的参数列表,如改成typedef void   (*EventHandler)(double,double,double);

这样就可以传递三个参数。

调用的时候按照如下的方法调用:
EventHandler notifyEvent = AllEvent.GetEvent()[i];

(*notifyEvent)(tmpdouble1,tmpdouble2,tmpdouble3);

2.注册类成员的非静态函数

上面的用法,我们可以看到,需要输入函数的地址。但是在C++的类设计中,非静态类方法是设置为共用的,即无论实例化多少个对象,都只会分配一个函数地址,只有一个函数副本。
例如fun()是类foo中的一个成员,foo a,b;
我们在调用a.fun()是,编译器会自动修改为fun(&a),即传递对象的this指针,共用相同的函数。
这时,我们无法通过foo::fun注册回调函数。因为我们每个实例化的对象对应的fun里面操作的属性可能都不一样。

需要使用std::bind来进行非静态函数绑定,具体方法如下:

#include<functional>
typedef std::function<void(void)> callBackFunction;
callBackFunction bindFun=std::bind(&foo::func,this);

带参数的版本如下:

#include<functional>
typedef std::function<void(double,double,double)> callBackFunction;
callBackFunction bindFun=std::bind(&foo::func,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3);
 

然后我们可以把bindFun添加到相应的容器或函数参数中。

发表评论

电子邮件地址不会被公开。 必填项已用*标注