#ifndef __DISPATCHER_H #define __DISPATCHER_H #include #include template class Dispatcher { public: typedef std::function CBType; class CBID { public: CBID() : valid(false) {} private: friend class Dispatcher; CBID(typename std::list::iterator i) : iter(i), valid(true) {} typename std::list::iterator iter; bool valid; }; // register to be notified CBID addCB(CBType cb) { if (cb) { cbs.push_back(cb); return CBID(--cbs.end()); } return CBID(); } // unregister to be notified void delCB(CBID &id) { if (id.valid) { cbs.erase(id.iter); } } void broadcast(Args... args) { for (auto &cb : cbs) { cb(args...); } } private: std::list cbs; }; #endif