Por un tiempo estaba confundido acerca de la dirección de sobrecarga del operador de D's, pero ahora me doy cuenta de que es un sistema hermoso ... si solo funciona con tipos de núcleo (int, flotante, etc.). Considere el código de seguimiento:Sobrecarga elegante del operador en D
struct Vector {
float X, Y;
void opOpAssign(string op)(Vector vector) {
X.opOpAssign!op(vector.X); // ERROR: no property "opOpAssign" for float
Y.opOpAssign!op(vector.Y); // ERROR: ditto
}
}
Esto sería hermoso código si ha funcionado, ya que se sobrecarga todos + =, - =, * =, etc .. operadores en un método. Sin embargo, como puede ver, no funciona de la caja. He creado una solución utilizando plantillas (dios Me encanta D):
template Op(string op, T) {
void Assign(ref T a, T b) {
static if (op == "+") a += b;
else if (op == "-") a -= b;
else if (op == "*") a *= b;
else if (op == "/") a /= b;
}
}
struct Vector {
float X, Y;
void opOpAssign(string op)(Vector vector) {
Op!(op, typeof(X)).Assign(X, vector.X);
Op!(op, typeof(Y)).Assign(Y, vector.Y);
}
}
Esto está bien, sólo el Yo más prefieren mantener todo "en casa". ¿Hay alguna manera de hacer que esto funcione sin la ayuda de una plantilla? Sé que estoy siendo exigente aquí, ya que no hay pérdida de rendimiento y no es difícil importar un módulo en una situación en la que necesito hacerlo. Me pregunto si está integrado y estoy pasando por alto algo.
Tenga en cuenta que 'if' estático no se continuó después de' 'if's después else'. Tienes que repetir 'static' nuevamente. – Bolpat