事件订阅代码

VariantEvent.h
#pragma
once #include <functional> #include <map> #include <mutex> #include <future> template<typename... Arguments_> class SVPVariantEvent { public: typedef std::function<void(const Arguments_&...)> Listener; SVPVariantEvent() : m_nextSubscription(0) {} uint32_t subscribe(Listener listener); void unsubscribe(uint32_t subscritpion); public:/*protected:*/ void fire(const Arguments_&... _eventArguments); void fireAsync(const Arguments_&... _eventArguments); private: uint32_t m_nextSubscription; std::map<uint32_t, Listener> m_Listeners; std::recursive_mutex m_mtx; }; template<typename... Arguments_> uint32_t SVPVariantEvent<Arguments_...>::subscribe(Listener listener) { std::lock_guard<std::recursive_mutex> lock(m_mtx); int32_t subscription = m_nextSubscription++; m_Listeners[subscription] = std::move(listener); return subscription; } template<typename... Arguments_> void SVPVariantEvent<Arguments_...>::unsubscribe(uint32_t subscription) { std::lock_guard<std::recursive_mutex> lock(m_mtx); m_Listeners.erase(subscription); } template<typename ... Arguments_> void SVPVariantEvent<Arguments_...>::fire(const Arguments_&... eventArguments) { std::lock_guard<std::recursive_mutex> lock(m_mtx); for (auto& x : m_Listeners) { x.second(eventArguments...); } } template<typename ... Arguments_> void SVPVariantEvent<Arguments_...>::fireAsync(const Arguments_&... eventArguments) { auto handle = std::async(std::launch::async, [&] { fire(eventArguments...); }); }

 

原文链接: https://www.cnblogs.com/yuguangyuan/p/11364116.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    事件订阅代码

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/397673

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月11日 上午9:41
下一篇 2023年4月11日 上午9:41

相关推荐