Header.h 1013 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #pragma once
  2. #ifndef __DISPATCHER_H
  3. #define __DISPATCHER_H
  4. #include <functional>
  5. #include <list>
  6. template <typename... Args>
  7. class Dispatcher
  8. {
  9. public:
  10. typedef std::function<void(Args...)> CBType;
  11. class CBID
  12. {
  13. public:
  14. CBID() : valid(false) {}
  15. private:
  16. friend class Dispatcher<Args...>;
  17. CBID(typename std::list<CBType>::iterator i)
  18. : iter(i), valid(true)
  19. {}
  20. typename std::list<CBType>::iterator iter;
  21. bool valid;
  22. };
  23. // register to be notified
  24. CBID addCB(CBType cb)
  25. {
  26. if (cb)
  27. {
  28. cbs.push_back(cb);
  29. return CBID(--cbs.end());
  30. }
  31. return CBID();
  32. }
  33. // unregister to be notified
  34. void delCB(CBID& id)
  35. {
  36. if (id.valid)
  37. {
  38. cbs.erase(id.iter);
  39. }
  40. }
  41. void broadcast(Args... args)
  42. {
  43. for (auto& cb : cbs)
  44. {
  45. cb(args...);
  46. }
  47. }
  48. private:
  49. std::list<CBType> cbs;
  50. };
  51. #endif