Per un po 'sono stato confuso dalla direzione del sovraccarico dell'operatore di D, ma ora mi rendo conto che è un sistema bellissimo ... se funzionasse solo con i tipi di core (int, float, ecc.). Si consideri il codice seguente:Elegante sovraccarico dell'operatore in 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
}
}
Questo sarebbe il codice bello se ha funzionato, visto che sovraccarica tutto + =, - =, * =, ecc .. operatori in un metodo. Tuttavia, come puoi vedere, non funziona immediatamente. Ho creato una soluzione utilizzando i modelli (dio amo 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);
}
}
Questo va bene, solo mi piacerebbe molto preferiscono tenere tutto "in casa". C'è un modo per farlo funzionare senza l'ausilio di un modello? So che sono schizzinoso qui, visto che non ci sono perdite di prestazioni e non è difficile importare un modulo in una situazione che devo fare. Mi sto solo chiedendo se è integrato e sto trascurando qualcosa.
Si noti che 'if' statico non è continuato a seguire' 'if's dopo else'. Devi ripetere 'static' di nuovo. – Bolpat