#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; } }; }