#include #include #include #include namespace messaging { struct message_base { virtual ~message_base() {} }; template struct wrapped_message : message_base { Msg contents; explicit wrapped_message(Msg const& contents_) : contents(contents_) {} }; class queue { std::mutex m; std::condition_variable c; message_base std::queue> q; public: template void push(T const& msg) { std::lock_guard lk(m); q.push(std::make_shared>(msg)); c.notify_all(); } std::shared_ptr wait_and_pop() { std::unique_lock lk(m); c.wait(lk, [&] { return !q.empty(); }); auto res = q.front(); q.pop(); return res; } }; }