#pragma once #include template class Callback; template class CallbackOwner { std::vector> CallbackTargets; public: void Invoke(T... args) const { for(std::function& target : CallbackTargets) target(args...); } Callback GetCallback() { return Callback(CallbackTargets); } }; template class Callback { private: std::vector>& CallbackTargets; public: void Register(const std::function& target) { CallbackTargets.push_back(target); } void Unregister(const std::function& target) { for(int i =0; i < CallbackTargets.size(); i++) { if(CallbackTargets[i].template target() == target.template target()) { CallbackTargets.erase(CallbackTargets.begin() + i); return; } } // Todo: Throw error for unregistering inexisting target } Callback(std::vector>& CallbackTargets) : CallbackTargets(CallbackTargets) { } Callback& operator+=(const std::function& target) { Register(target); return *this; } Callback& operator-=(const std::function& target) { Unregister(target); return *this; } };