ConsoleApplication5.cpp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include <functional>
  2. #include <vector>
  3. #include <map>
  4. #include <iostream>
  5. template <class... Params>
  6. class Event
  7. {
  8. public:
  9. template <class T>
  10. using MemberPtr = void (T::*)(Params...);
  11. using Callback = std::function<void(Params...)>;
  12. template <class T>
  13. void
  14. Subscribe(T* t, MemberPtr<T> m)
  15. {
  16. const auto lambda = [=](Params&&... params) { (t->*m)(std::forward<Params>(params)...); };
  17. Addcallback(lambda);
  18. }
  19. void
  20. Notify(Params&&... params) const
  21. {
  22. for (const auto& callback : mCallbacks)
  23. {
  24. callback(std::forward<Params>(params)...);
  25. }
  26. }
  27. private:
  28. void
  29. Addcallback(Callback callback)
  30. {
  31. mCallbacks.emplace_back(callback);
  32. }
  33. std::vector<Callback> mCallbacks;
  34. std::map<int, Callback> mCall_map;
  35. };
  36. struct EventListener
  37. {
  38. void
  39. eventListenerCallback(int i)
  40. {
  41. std::cout << "Received " << i << std::endl;
  42. }
  43. };
  44. struct DoublingListener
  45. {
  46. void
  47. eventListenerCallback(int i, int y)
  48. {
  49. std::cout << "Double of received value " << i * 2 << std::endl;
  50. }
  51. };
  52. int
  53. main()
  54. {
  55. Event<int> event;
  56. Event<int,int> eventD;
  57. EventListener listener;
  58. DoublingListener doublingListener;
  59. event.Subscribe(&listener, &EventListener::eventListenerCallback);
  60. eventD.Subscribe(&doublingListener, &DoublingListener::eventListenerCallback);
  61. event.Notify(1337);
  62. return 0;
  63. }