#pragma once template class event { using func_type = std::function; std::mutex event_lock; std::list m_funcs; public: void add(const func_type& func) { std::lock_guard lock(event_lock); m_funcs.emplace_back(std::move(func)); } void call(Args... params) { std::lock_guard lock(event_lock); for (auto& func : m_funcs) { if (func) func(std::forward(params)...); } } };