1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
class Observer {
private:
map<string, signal.....> signalContainer;// how to write the container?
public:
template<typename T>
void addListener(string eventName, T fn) {
signalContainer[eventName]->connect(fn);
}
template<typename T1, typename T2>
void addListener(string eventName, T1 object, T2 fn) {
signalContainer[eventName]->connect(obj, fn);
}
void fireEvent(string eventName) {
signalContainer[eventName]();
}
template<typename T1>
void fireEvent(string eventName, T1 arg1) {
signalContainer[eventName](arg1);
}
template<typename T1, typename T2>
void fireEvent(string eventName, T arg1, T arg2) {
signalContainer[eventName](arg1, arg2);
}
};
// usage
class Window : public Observer {
// ...
public:
Window() {
// ...
this.addListener("move", this, Window::onMove);
}
void onMove(int x, int y) {
cout << "move to:" << x << ", " << y << endl;
}
};
int main() {
Window* w = new Window();
w.fireEvent("move", 200, 300);
return 0;
}
|