Dynamic multi-cast delegate template class (UObject-based, serializable). You'll use the various DECLARE_DYNAMIC_MULTICAST_DELEGATE macros to create the actual delegate type, templated to the function signature the delegate is compatible with. Then, you can create an instance of that class when you want to assign functions to the delegate.