回调函数就是自己写的一个函数,但是不能被显式的调用,而是把该函数的地址作为一个别的函数参数来引用,这样用来处理当一些事件发生时可以调用这个自己定义的回调函数,完成一些处理。
#include <iostream>
#include <map>
using namespace std;
void MouseDown() {
cout << "mouse down" << endl;
}
void MouseUp() {
cout << "mouse up" << endl;
}
void MouseMove() {
cout << "mouse move" << endl;
}
enum Mouse_Event {
MOUSE_DOWN = 1,
MOUSE_UP,
MOUSE_MOVE
};
typedef void (*p_fun)() ;
class MouseResponse {
public:
class CanNotFound {
public:
void what_happend() {
cout << "can not found" << endl;
}
};
typedef map<Mouse_Event,p_fun> FunMap;
typedef FunMap::iterator FunMap_Itr;
// 为各类事件设置回调函数。
bool add_event(Mouse_Event me,p_fun p) {
pair<FunMap_Itr,bool>ret;
ret = _funMap.insert(FunMap::value_type(me,p));
return ret.second;
}
//查找回调函数
p_fun get_fun(Mouse_Event me) {
FunMap_Itr re = _funMap.find(me);
if(re != _funMap.end()) {
return re->second;
}
throw CanNotFound();
}
private:
FunMap _funMap;
};
void OnMouseDown(MouseResponse &mr,Mouse_Event event = MOUSE_DOWN ) {
try {
p_fun ptr = mr.get_fun(event);
ptr();
} catch (MouseResponse::CanNotFound &cnf) {
cnf.what_happend();
}
}
int main()
{
MouseResponse mr;
mr.add_event(MOUSE_DOWN,MouseDown);
mr.add_event(MOUSE_UP,MouseUp);
mr.add_event(MOUSE_MOVE,MouseMove);
short event;
cout << "pelase cin a mouse event" << endl;
cin >> event;
mr.get_fun((Mouse_Event)event)(); //找到响应该事件的回调函数,并调用。
return 0;
}