Ich bin neue Operator Überladungen hinzufügen, um Vorteile von C++ 0x rvalue Referenzen zu nutzen, und ich fühle mich wie ich eine Menge von redundantem Code produzieren.Wie reduziere ich redundanten Code beim Hinzufügen neuer C++ 0x Rvalue Referenz Operator Überladungen
Ich habe eine Klasse, tree
, die einen Baum der algebraischen Operationen auf doppelte Werte enthält. Hier ist ein Beispiel Anwendungsfall:
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"
Für jede binäre Operation (wie plus), kann jede Seite entweder ein L-Wert tree
, rvalue tree
oder double
. Dies führt zu 8 Überlastungen für jede binäre Operation:
// 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
, die auch in einer Art und Weise für jede binäre Operation (minus, multiplizieren, dividieren usw.) wiederholt werden.
Wie Sie sehen können, gibt es wirklich nur 4 Funktionen, die ich tatsächlich schreiben muss; die anderen 4 können in die Kernfälle werfen und weiterleiten.
Haben Sie Vorschläge zur Reduzierung der Größe dieses Codes?
PS: Die Klasse ist eigentlich komplexer als nur ein Baum der Doppelgänger. Das Reduzieren von Kopien verbessert die Leistung meines Projekts erheblich. Also, die Rvalue-Überladungen sind für mich lohnenswert, auch mit dem zusätzlichen Code. Ich habe den Verdacht, dass es einen Weg zur Vorlage die "cast and forward" -Fälle oben geben könnte, aber ich kann nicht scheinen, an etwas zu denken.
+1, mit Rvalue Referenzen nach Wert übergeben ist wieder in der Art –
Dies funktioniert perfekt. – Inverse
Aber ich musste hinzufügen '+ (double a, tree b)' und '(tree a, double a)' Versionen. – Inverse