The '14 version you have provided is exactly what my proposal generates, but without the indirection. Much of my code involves exactly this pattern, stitched together with a pipeline builder struct, cringy use of the >> operator and helper macros for yield, etc. It suffices, but it's crying out for either a new language, a preprocessor, or a new language feature.
You'll also note that debugging through the callback approach is nothing less than horrific, especially if any pipeline building code is involved (just like with variants). I can't imagine this changing while the code being written is in the form of callbacks.
The reason is that given N components of the pipeline (each yielding a new value to be passed to the next), an unhandled type from component N-1 to component N bubbles an error generating from the first call to component 0. Deciphering the message that comes out is fun, to say the least, and while static_assert is unable to add typenames etc there's no real way around it.
As a language feature, it's easy. The compiler is aware of what you're trying to do, and can provide useful information when you get it wrong.