For a while I was confused about the direction of D\'s operator overloading, but now I realize it\'s a beautiful system... if It would only work with core types (int, float, etc
Almost all overloaded operators in D are templates by definition. Notice that void opOpAssign(string op)(Vector vector)
has a template parameter which is a string. So, no you can't overload it as a non-template function. Now, you don't need a second template to do it (so if by asking whether you need a template, you mean a helper template, then the answer is no), but the overloaded operator function is already a template.
The canonical way to do what you you're trying to do here is to use string mixins:
void opOpAssign(string op)(Vector vector)
{
mixin("X" ~ op ~ "=vector.X;");
mixin("Y" ~ op ~ "=vector.Y;");
}