I think you can do this in a more elegant way. Change e.g. `_VAdd8u` into a template `VAdd<T>` that's specialized for every needed `T`. Then in e.g. `add8u` you can use `VAdd<uchar>` as the template parameter. You'll also need to write a similar template for load/store intrinsics. After that, you get get rid of all the casts here and also in `vBinOp*`.

You can also write a helper macro to generate these specializations (as the only difference seems to be the name of the struct and of the called intrinsic) but that's up to you.