Thanks to @jules example above, in the process of Lambda-ifying a class to make it more “functional style” and flexible I needed to set a callback on a TransportAudioSource when it reaches the end of a file:
void attachChangeListenerCallback (ChangeBroadcaster& source, std::function<bool ()> callback)
{
struct ChangeListenerCallback : public ChangeListener
{
ChangeListenerCallback (ChangeBroadcaster& b, std::function<bool()> f) : target (b), fn (f)
{
target.addChangeListener (this);
}
~ChangeListenerCallback()
{
target.removeChangeListener (this);
}
void changeListenerCallback (ChangeBroadcaster*) override
{
if (fn())
{
// Delete listener once successfully executed
delete this;
}
}
ChangeBroadcaster& target;
std::function<bool()> fn;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChangeListenerCallback)
};
new ChangeListenerCallback (source, callback);
}
I made the lambda return a bool
so that the listener can be deleted once a condition is met.