I don't know of a built-in way, but maybe you could write a function as above that saves and restores the view, though it would be tricky if the undo adds or removes lines above the cursor location. Then, map u to it.
It's easy to figure out whether the undo added or removed lines (and how many). Then, you could look at where the cursor has ended up. If it's before your original location, then you need to adjust the values you pass to winrestview to move the return location up or down by the number of rows added.
It'll probably still be less than perfect if the change is right around the cursor location, but those don't move the cursor much.
Salman