Aggiungo nuovi overload di operatore per sfruttare i riferimenti di runtime C++ 0x e mi sembra di produrre un sacco di codice ridondante.Come ridurre il codice ridondante quando si aggiungono nuovi sovraccarichi dell'operatore di riferimento di runtime C++ 0x
Ho una classe, tree
, che contiene un albero di operazioni algebriche su valori doppi. Ecco un caso esempio uso:
tree x = 1.23;
tree y = 8.19;
tree z = (x + y)/67.31 - 3.15*y;
...
std::cout << z; // prints "(1.23 + 8.19)/67.31 - 3.15*8.19"
Per ogni operazione binaria (come plus), ogni lato può essere sia un lvalue tree
, rvalue tree
o double
. Ciò si traduce in 8 sovraccarichi per ciascuna operazione binaria:
// core rvalue overloads for plus:
tree operator +(const tree& a, const tree& b);
tree operator +(const tree& a, tree&& b);
tree operator +(tree&& a, const tree& b);
tree operator +(tree&& a, tree&& b);
// cast and forward cases:
tree operator +(const tree& a, double b) { return a + tree(b); }
tree operator +(double a, const tree& b) { return tree(a) + b; }
tree operator +(tree&& a, double b) { return std::move(a) + tree(b); }
tree operator +(double a, tree&& b) { return tree(a) + std::move(b); }
// 8 more overloads for minus
// 8 more overloads for multiply
// 8 more overloads for divide
// etc
che ha anche essere ripetuta in modo per ciascuna operazione binaria (meno, moltiplicazione, divisione, ecc).
Come potete vedere, ci sono davvero solo 4 funzioni che ho effettivamente bisogno di scrivere; gli altri 4 possono lanciare e inoltrare ai casi principali.
Avete suggerimenti per ridurre le dimensioni di questo codice?
PS: La classe è in realtà più complessa di un semplice albero di doppio. Ridurre le copie migliora notevolmente le prestazioni del mio progetto. Quindi, i sovraccarichi di valore valgono per me, anche con il codice extra. Ho il sospetto che potrebbe esserci un modo di sostituire il modello in "avanti e indietro", ma non riesco a pensare a nulla.
+1, con i riferimenti Rval passano di valore è tornato in stile –
Ciò funziona perfettamente. – Inverse
Ma ho dovuto aggiungere le versioni '+ (double a, tree b)' e '(tree a, double a)'. – Inverse