This looks like a job for pointer to members:
Well, that makes it a whole lot easier. Thank you! I've never used pointer-to-member before.
I couldn't think of any way to make it template only - I briefly considered using a byte 'stride'-type function, casting to char*, but other than that horrible idea I was drawing a blank.