So aside from things stopping compiling, this ValueTreeSynchronizer looks good. I'll have a go at bolting onto my cross-thread synchronizer to replace my cheap and dirty mechanism later :)
Incidentally - what's the argument for and against implementing them as pure virutal functions rather than virtual functions with an empty body (which would let you choose which you cared about).
Thanks - it's very new code that's not properly tested yet, so be careful!
In this case it's pure-virtual because there'd be really no point in using the class without implementing that method, so making it pure will make sure the compiler complains if you forget to do so.
Sure, but that's the ValueTree::Listener, I thought you were talking about the ValueTreeSynchroniser, which just has one virtual method.
One advantage of having them pure is that in a case like the ValueTree::Listener where I had to change the parameters, it guarantees that everybody will be forced to update their code, and can't accidentally get a silent error when the method they were overloading changes.