Has this ever been considered?
Perhaps ListenerList could be made WeakReferencable and then you could do something liek this:
template <typename Callback>
void callAsync(Callback&& callback)
{
auto asyncCallback = [weakRef = WeakReference<ListenerList>(this),
cb = std::move(callback)]()
{
if( weakRef.get() )
weakRef->call(cb);
};
MessageManager::callAsync( asyncCallback );
}
I’ve been sprinkling this in my project in a few classes where I needed async ListenerList callbacks happening.
template<typename Callable>
void callAsync(Callable&& callback)
{
auto asycnCall = [cb = std::move(callback), weakRef = WeakReference<TheClass>(this)]()
{
if( weakRef.get() )
{
const ScopedLock sl(weakRef->listenerLock);
weakRef->listenerList.call(cb);
}
};
MessageManager::callAsync(asycnCall);
}
It works well enough for me to not stress over it.
