C ++ mehrere Operatorüberladungen für denselben Operator

7

Ich weiß, dass ich diese Frage leicht selbst beantworten kann, indem ich den Code generiere und sehe, ob er kompiliert. Aber da ich keine ähnliche Frage finden konnte, dachte ich, es sei Wissen wert, geteilt zu werden. Angenommen, ich übertreibe den Operator + für MyClass. Kann ich es mehrfach überlasten? Unterschiedliche Überladung für verschiedene Typen. So:

%Vor%

Der Grund, warum ich das möchte, ist, dass ich eine Klasse erstelle, die so optimiert wie möglich sein soll. Leistung ist das größte Problem für mich hier. So Casting und Verwendung von Schaltergehäuse in der Operator + überladene Funktion ist keine Option. Wenn Sie es bemerken, habe ich beide Überladungen inline gemacht. Lassen Sie uns für eine Sekunde annehmen, dass der Compiler tatsächlich meine Überladungen einfügt, dann wird zur Kompilierungszeit vorbestimmt, welcher Code ausgeführt wird, und ich speichere den Aufruf einer Funktion (durch Inlining) + ein kompliziertes Switch Case Szenario (in Wirklichkeit wird es sein 5+ Überladungen für + Operator), aber bin immer noch in der Lage, leicht lesbaren Code mit grundlegenden arithmetischen Operatoren zu schreiben. Also, werde ich das gewünschte Verhalten bekommen?

    
eladidan 26.06.2010, 11:30
quelle

3 Antworten

8

Die kanonische Form der Implementierung von operator+() ist eine kostenlose Funktion basierend auf operator+=() , die Ihre Benutzer erwarten, wenn Sie + haben. += ändert sein linkes Argument und sollte daher ein Mitglied sein. Der + behandelt seine Argumente symmetrisch und sollte daher eine freie Funktion sein.

So etwas sollte tun:

%Vor%

(Beachten Sie, dass Elementfunktionen, die mit ihrer Klassendefinition definiert sind, implizit inline sind. Beachten Sie auch, dass in MyClass das Präfix MyClass:: entweder nicht benötigt wird oder sogar falsch ist.)

    
sbi 26.06.2010, 11:58
quelle
9

Ja.

Diese Operatorfunktionen sind nur gewöhnliche Funktionen mit den speziellen Namen operator@ . Es gibt keine Einschränkung, dass sie nicht überlastet werden können. Der von iostream verwendete Operator << ist ein Operator mit mehreren Überladungen.

    
kennytm 26.06.2010 11:32
quelle
2

Ja, Sie können Operatoren wie diese überlasten. Aber ich bin mir nicht sicher, auf welchen "Schalterfall" Sie sich beziehen. Sie können mit einer Überladung leben, wenn Sie einen Converting-Konstruktor haben

%Vor%

Es wird überhaupt kein Schalter benötigt. Dies ist zulässig, wenn "MyClass" logisch eine Zahl darstellt.

Beachten Sie, dass Sie diese Operatoren durch Nichtmitgliedsfunktionen überladen sollten. In deinem Code würde 5 + c1 nicht funktionieren, weil es keinen Operator gibt, der ein int als linke Seite nimmt. Folgendes würde funktionieren:

%Vor%

Wenn Sie nun den Converting-Konstruktor beibehalten, können Sie den Int auf jeder Seite mit minimalem Code-Overhead hinzufügen.

    
Johannes Schaub - litb 26.06.2010 11:34
quelle