I gues what you are looking for are
dynamic delegates. Dynamic allows for blueprint and cpp binding, but only one listener. If you need more listener you need dynamic multicast delegate.
DECLARE_DYNAMIC_MULTICAST_DELEGATE…(FYourDelegate, …)
in class
UPROPERTY(BlueprintAssignable, …)
FYourDelegate delegateVariableName;