CppEvent.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // CppEvent.cpp : This file contains the 'main' function. Program execution begins and ends there.
  2. // https://medium.com/@alwayswannaly/applied-event-driven-programming-with-c-b2f6977f0b72
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <iostream>
  6. #include <vector>
  7. #include <map>
  8. class EventManager {
  9. private:
  10. std::map<std::string, std::vector<void (*)(int)> > events;
  11. public:
  12. EventManager() {}
  13. EventManager* on(std::string event_name, void (*callback)(int)) {
  14. // we're using a pointer to reference `events[event_name]` so as
  15. // to get reference to original object and not the copy object.
  16. std::vector<void (*)(int)>* listeners = &events[event_name];
  17. // if this listener is already registered, we wont add it again
  18. if (std::find(listeners->begin(), listeners->end(), callback) != listeners->end()) {
  19. return this;
  20. }
  21. listeners->push_back(callback);
  22. return this;
  23. }
  24. bool emit(std::string event_name, int arg) {
  25. std::vector<void (*)(int)> listeners = events[event_name];
  26. if (listeners.size() == 0) return false;
  27. // Run all the listeners associated with the event
  28. for (int idx = 0; idx < listeners.size(); idx += 1) {
  29. listeners[idx](arg);
  30. }
  31. return true;
  32. }
  33. };
  34. void callback1(int num) {
  35. std::cout << "\n";
  36. std::cout << "callback1-" << num * 2;
  37. }
  38. void callback2(int num) {
  39. std::cout << "\n";
  40. std::cout << "callback2-" << num / 2;
  41. }
  42. int main() {
  43. EventManager* event_manager = new EventManager();
  44. event_manager->on("event", callback1)->on("event", callback2);
  45. int eventA = event_manager->emit("event", 100);
  46. int eventB = event_manager->emit("bad_event", 200);
  47. std::cout << "\n";
  48. std::cout << eventA << " " << eventB << "\n";
  49. return 0;
  50. }