相关文章:C++中的观察者模式
1.关于回调函数传输的传递
在上文(C++中的观察者模式)中,采用了常用的void函数和空参数。
我们可以通过修改typedef
void
(*EventHandler)(
void
);中的参数列表,如改成
typedef
void
(*EventHandler)(double,double,double
);
这样就可以传递三个参数。
调用的时候按照如下的方法调用:
EventHandler notifyEvent = AllEvent.GetEvent()[i];
(*notifyEvent)(tmpdouble1,tmpdouble2,tmpdouble3);
上面的用法,我们可以看到,需要输入函数的地址。但是在C++的类设计中,非静态类方法是设置为共用的,即无论实例化多少个对象,都只会分配一个函数地址,只有一个函数副本。
例如fun()是类foo中的一个成员,foo a,b;
我们在调用a.fun()是,编译器会自动修改为fun(&a),即传递对象的this指针,共用相同的函数。
这时,我们无法通过foo::fun注册回调函数。因为我们每个实例化的对象对应的fun里面操作的属性可能都不一样。
需要使用std::bind来进行非静态函数绑定,具体方法如下:
[c language=”++”]
#include<functional>
typedef std::function<void(void)> callBackFunction;
callBackFunction bindFun=std::bind(&foo::func,this);
[/c]
带参数的版本如下:
[c language=”++”]
#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);
[/c]
然后我们可以把bindFun添加到相应的容器或函数参数中。