#pragma once #include "globalincs/pstypes.h" #include namespace util { template class event final { public: using callback_type = std::function; event() = default; ~event() = default; void add(callback_type func) { _listeners.push_back(func); } void clear() { _listeners.clear(); } // This variant is used if the listeners return no values template inline typename std::enable_if::value, Dummy>::type operator()(Args... args) const { for (const auto& l : _listeners) { l(args...); } } // In this case we collect the return values and return them to the caller template > inline typename std::enable_if::value, Dummy>::type operator()(Args... args) const { SCP_vector vals; for (const auto& l : _listeners) { vals.push_back(l(args...)); } return vals; } private: SCP_vector _listeners; }; } // namespace util