Ich möchte eine Art von "Anzahl-wie" mathematische Objekte (sagen wir, Elemente in einer Gruppe oder einem Ring) in C++ implementieren. Ich bin mir sicher, dass ich nicht der Einzige bin, der sich mit diesem Problem beschäftigt, daher gibt es reichlich Diskussionen darüber, was die "beste" Art ist, arithmetische Operatoren zu überlasten. Ich konnte jedoch keine befriedigenden Antworten finden (obwohl ich vielleicht zu faul war, mehr zu googeln).Was ist der "beste" Weg, arithmetische Operatoren in modernem C++ zu überladen?
Lassen Sie uns sagen, dass ich den Operator "+" für eine Klasse A. Das Problem ist, zu überlasten wollen, gibt zu viele verschiedene Überlastungen ich denken kann:
- operator + (const A & x, const A & y)
- operator + (const & A x, A y & &)
- operator + (A & & x, const A & y)
- operator + (A & & x, A & & y)
- A :: operator + = (const A & y) &
- A :: operator + = (const A & y) & &
- A :: operator + = (A & & y) &
- A :: operator + = (A & & y) & &
Erste Frage. Sind all diese Überladungen notwendig, um Operationen an Instanzen von A so effizient und so viel wie möglich wie "primitive Typen" zu machen? Ich denke, für "normale" Fälle muss rvalue-qualifizierter A :: -Operator + = nicht überlastet werden (oder sollte nicht). Ist es richtig? Ich denke alle 1-4 sind notwendig. Zum Beispiel müssen wir für den Fall 3, da x verschoben wird, keinen neuen Platz reservieren, um den Rückgabewert zu halten, und wir können den für x reservierten Zuordnungsspeicher sicher wiederverwenden. Ist es richtig?
Zweite Frage. Ich denke, dass all diese Überladungen viele Codes für die meisten dieser Fälle teilen. Wie kann ich die Code-Duplizierung minimieren, ohne Performance/etc. Gibt es spezielle Techniken/Idiome, um dies zu tun? Ich bevorzuge allgemeine und erweiterbare Methoden, falls vorhanden.
Vielen Dank, obwohl es ziemlich spät ist, zurück zu antworten :) Es scheint, dass die obige Methode nicht "der" effizienteste Weg ist, da es unnötige Bewegungen geben kann, aber scheint ziemlich vernünftig. Kann ich einige Hinweise dazu finden, was ich tun soll, wenn Expression-Templates betroffen sind? Ich kenne einige Arbeiten, die für C++ 03 geschrieben wurden, aber ich habe keine Ahnung von C++ 11. Danke nochmal. –