Kann man eigene Operatoren erstellen ?



  • Hallo,

    mal ne ganz kurze Frage ( hoffe ich )

    Ich lese gerade das man Operatoren überladen kann.
    Ihr wisst sicher wie, keine frage.

    Allerdings hab ich noch nicht gefunden ob man auch einen eigenen Operator erstellen könnte ?
    Geht das ?

    Sagen wir ich habe hier meine TestKlasse, die einfach nur einen Long Wert hält.
    Jetzt ( als Beispiel ) möchte ich einen ( mit absicht ) etwas merkwürdig aussehenden eigenen Operator haben, sagen wir der soll so aus 2 Pluszeichen und einem * Zeichen bestehen 🙂 ( ++* ).
    Er bekommt 3 Werte übergeben und Addiert die ersten beiden und Multipliziert diese dann mit dem dritten...nur mal asl Bsp.

    Ich möchte aber nur wissen ob man solch einen Eigenen Operator erstellen könnte, nicht wie man das problem (a+b)*c lösen kann.

    Matthias



  • Naja, dann ist die Antwort schlicht: Nein, geht nicht.



  • Oder ausführlicher: Du darfst (fast) alle vorhandenen Operatoren überladen (nur wenn benutzerdefinierte Typen beteiligt sind), aber du darfst weder neue Operatoren erzeugen noch darfst du die Rangfolge der Operatoren beeinflussen.

    Aber du könntest dir eventuell über Proxies aus den vorhandenen Operatoren etwas eigenes zusammenbauen:

    struct Proxie
    {
      const TestKlasse &op2,&op3;
      Proxie(const TestKlasse& o2,const TestKlasse& o3): op2(o2),op3(o3) {}
    };
    
    Proxie operator*(const TestKlasse& op2, const TestKlasse& op3)
    {
      return Proxie(op2,op3);
    }
    
    TestKlasse operator+(const TestKlasse& op1,const Proxie& rest)
    {
      return (op1+rest.op2)*rest.op3;
    }
    
    ...
    TestKlasse a,b,c;
    TestKlasse d = a+b*c;
    

    (Achtung, das ist nur hingeschludert - ich übernehme keine Garantie für den Code)



  • Wenn DAS möglich wäre, dann würden wir nocht mehr und noch längere "Java vs. C++" Threads haben. Denn dann wäre C++ ja noch komplexer, als es vielen Leuten sowieso schon ist. 😉



  • Hallo,

    ich danke euch für die Ausführungen.
    Die zweite Antwort schau ich mir später nochmal an, die ist für jetzt noch zu kompliziert und ich will auch nicht so weit vom "Stoff" abkommen.

    ALso danke Euch !

    Matthias



  • Artchi schrieb:

    Wenn DAS möglich wäre, dann würden wir nocht mehr und noch längere "Java vs. C++" Threads haben. Denn dann wäre C++ ja noch komplexer, als es vielen Leuten sowieso schon ist. 😉

    ... ich würde mal sagen: Wenn das möglich wäre, würde ein Haufen alten Codes tot an der "maximal-munch-Hürde" liegen. 😃

    Gruß,

    Simon2.



  • mach doch einfach ne template funktion wo du den funktionsnamen statt "++*" ein "ppm" gibst welches das ergebnis retuniert



  • Hallo,

    so etwa :

    template<typename Typ>
    Typ ppm(Typ x, Typ y, Typ z)
    {
    	return((x+y)*z);
    }
    

    Jap, würde, wie im ersten Posting schon erwähnt, das Problem lösen.
    Die Frage war aber eigentlich nur ob das geht, also ob man direkt einen neuen Operator erstellen kann.
    Die ist beantwortet ... geht nicht, also ok,

    Trotzdem nochmals Danke
    Matthias



  • Allerdings wird a++*b als (a++)*b gelesen. Man könnte also ++ und * so überladen, dass sie zusammen das gewünschte erledigen. 🙂



  • Jetzt setzt ihm doch nicht auch noch solche Flausen in den Kopf 😉


Anmelden zum Antworten