operator,



  • Naja, ist ja schonmal was, danke! Und an das Komma im for-Konstrukt hatte ich ja gar nicht gedacht 😋



  • Badestrand schrieb:

    Meine einzige Idee wäre übrigens, weil der Operator ja left-to-right agiert, den irgendwie für String-Verkettung o.ä. zu benutzen, wäre aber auch gewöhnungsbedürftig...

    Genau das kannst du nicht machen bzw davon sichergehen das der gesamt Ausdruck von links nach rechts läuft.

    Wenn du op, überlädst hast du eine Funktion und es ist nicht bestimmt, in welcher Reihenfolge die Argumente einer Funktion ausgewertet werden.

    In Effekitv oder Mehr Effektiv C++ steht was dazu.

    Aber gegen eine einfach Stringverkettung mit op, spricht nichts gegen, da ist es egal was zuerst ausgewertet wird, falls da was ausgewertet werden sollte 😉



  • KasF schrieb:

    In Effekitv oder Mehr Effektiv C++ steht was dazu.

    japs, und soweit ich mich erinner steht da, das man den komma operator nicht ueberladen sollte #gg



  • Badestrand schrieb:

    Hi!

    Ich bin grad zufällig drauf gestoßen, dass man den operator "," (Komma) überladen kann. Bei Wikipedia ist auch ein kleines Anwendungsbeispiel.

    Meine Frage ist: Benutzt irgendjemand (regelmäßig) den Komma-Operator oder kann man den für irgendwas gut gebrauchen?

    Meine einzige Idee wäre übrigens, weil der Operator ja left-to-right agiert, den irgendwie für String-Verkettung o.ä. zu benutzen, wäre aber auch gewöhnungsbedürftig...

    Nein, der Komma-Operator kann man nicht überladen. Selbst B. Stroustrup hat es gesagt.
    Außerdem wird der Komma-Operator im Fall von parallelausgeführten Anweisungen benutzt und nicht in for Schleifen.



  • Zdravko schrieb:

    Nein, der Komma-Operator kann man nicht überladen.

    Man kann schon.



  • Und parallel werden auch keine Anweisungen ausgeführt.



  • KasF schrieb:

    Badestrand schrieb:

    Meine einzige Idee wäre übrigens, weil der Operator ja left-to-right agiert, den irgendwie für String-Verkettung o.ä. zu benutzen, wäre aber auch gewöhnungsbedürftig...

    Genau das kannst du nicht machen bzw davon sichergehen das der gesamt Ausdruck von links nach rechts läuft.

    Wenn du op, überlädst hast du eine Funktion und es ist nicht bestimmt, in welcher Reihenfolge die Argumente einer Funktion ausgewertet werden.

    In Effekitv oder Mehr Effektiv C++ steht was dazu.

    Aber gegen eine einfach Stringverkettung mit op, spricht nichts gegen, da ist es egal was zuerst ausgewertet wird, falls da was ausgewertet werden sollte 😉

    In welcher Reihenfolge Argumente ausgewertet werden hat mit dem Aufruf der Funktion(=Komma-Operator) selbst doch nichts zu tun.
    Die von dir angesprochene Problematik hast du bei allen Arten von verketteten Funktionsaufrufen, d.h. darauf sollte ein Programmierer bereits instinktiv achten.

    Ein

    String str = "ein","gestückelter","string";
    

    sollte sich nicht anders verhalten als

    String str = concat( "ein", concat( "gestückelter", "string" ) );
    

    Wenn a+b != b+a gilt, dann ist das eine Eigenschaft der Funktion die man bei der Anwendung berücksichtigen muss (ist bei der Verkettung von String der Fall).



  • Ergänzung:

    Man muss natürlich zwischen dem built-in Komma-Operator und dem überladenen Komma-Operator (=Funktionsaufruf) unterscheiden ⚠



  • LordJaxom schrieb:

    Zdravko schrieb:

    Nein, der Komma-Operator kann man nicht überladen.

    Man kann schon.

    Seit wann ist es so?



  • @lolz: Vielleicht hast du mich falsch verstanden, oder ich habe mich falsch ausgedrückt.

    Es ist ja klar, dass bei...

    if( exp1 && exp2 )
    

    ...exp2 nie ausgwertet wird, wenn exp1 falsch sein sollte.

    Genau wie in:

    int a = exp1,exp2,exp3;
    

    zuerst exp1 dann exp2 und dann exp3 ausgwertet wird.

    Jetzt könnte es aber sein, dass exp2 bei einem der Beispiele von exp1 abhängt, zB beim ersten dass exp1 auf pointer Null Prüfung ist und exp2 was mit dem pointer macht.

    Oder beim zweiten, dass exp2 von dem ergebniss von exp1 abhängt.
    Bei den eingebauten &&,||, , ist die Reihenfolge gewährleistet. Jedoch wenn man einen dieser Operatoren überladen sollte, man nicht diese Reihenfolge erzwingen kann, da es unbestimmt ist welches Argument zuerst ausgwertet wird, was an eine Funktion übergeben wird.

    Jedenfalls meinte ich nur das 😉



  • Zdravko schrieb:

    LordJaxom schrieb:

    Zdravko schrieb:

    Nein, der Komma-Operator kann man nicht überladen.

    Man kann schon.

    Seit wann ist es so?

    Schon immer bzw. ungefähr solange wie man überhaupt in C++ Operatoren überladen kann.



  • Bashar schrieb:

    Zdravko schrieb:

    LordJaxom schrieb:

    Zdravko schrieb:

    Nein, der Komma-Operator kann man nicht überladen.

    Man kann schon.

    Seit wann ist es so?

    Schon immer bzw. ungefähr solange wie man überhaupt in C++ Operatoren überladen kann.

    Im Prinzip hast du Recht:

    11.2 Operator Functions [over.oper]
    Functions defining meanings for the following operators (§6.2) can be declared:
    + *
    / % ^ &
    | ~ ! = < > +=

    *= /= %= ^= &= |=
    << >> >>= <<= == != <=

    = && || ++ >*
    ,

    [] () new new[] delete delete[]
    The following operators cannot be defined by a user:
    :: (scope resolution; §4.9.4, §10.2.4),
    . (member selection; §5.7), and
    .* (member selection through pointer to function; §15.5).

    Aber dann kann man noch lesen:

    Because of historical accident, the operators = (assignment), & (addressof),
    and , (sequencing;
    §6.2.2) have predefined meanings when applied to class objects. These predefined meanings can
    be made inaccessible to general users by making them private:
    c l a s s X {
    p r i v a t e :
    v o i d o p e r a t o r =(c o n s t X &);
    v o i d o p e r a t o r &();
    v o i d o p e r a t o r ,(c o n s t X &);
    / / ...
    };
    Section 11.2.2 Predefined Meanings for Operators 265
    v o i d f (X a ,X b )
    {
    a = b; / / error: operator= private
    &a ; // error: operator& private
    a ,b ; // error: operator, private
    }
    Alternatively, they can be given new meanings by suitable definitions.

    Kann mir jemand jetzt ein Beispiel geben, wo , als Überladener Operator benutzt wird?



  • Zdravko schrieb:

    Im Prinzip hast du Recht:

    Wieso im Prinzip?

    Kann mir jemand jetzt ein Beispiel geben, wo , als Überladener Operator benutzt wird?

    http://www.oonumerics.org/blitz/docs/blitz_2.html#SEC34



  • boost::lambda benutzt den operator, ebenfalls als Ersatz für das Semikolon (in lambda-funktionen)



  • boost::assign nutzt den operator um listen aus objekten zu erzeugen.

    http://www.boost.org/libs/assign/doc/index.html



  • Hmmmmm,

    ich weiß nicht, ob ich das überhaupt in Erwägung ziehen würde....
    Bekommt man eigentlich bei sowas Mehrdeutigkeiten:

    struct A {
       A operator,(A, A);
    }
    
    void f(A);
    void f(A, A);
    
    int main() {
       A a1, a2;
       f(a1, a2);
    ...
    

    ??
    Oder gibt's da einen "eingebauten Vorrang" ?
    Immerhin könnte man sonst damit doch "typsichere variable Argumentlisten" bauen, oder ?

    Gruß,

    Simon2,



  • Da gibt's einen eingebauten Vorrang - das Trennzeichen in Argumentlisten ist nicht dein operator, (genauso wenig wie das Trennzeichen zwischen Variablendeklarationen).



  • Luabind (http://www.rasterbar.com/products/luabind.html) verwendet den , Operator auch:

    module(L)
    [
        def("f", (int(*)(const char*)) &f),
        def("f", (void(*)(int)) &f)
    ];
    

    Außerdem kann man mit den "," Operator mehrere Anweisungen in einer Zeile unterbringen. Falls man das irgendwann mal von nöten sein sollte:

    #define gl_call( func ) ( func ), assert( glGetError() == GL_NO_ERROR && #func )
    


  • Zu guter Letzt noch: Boost.Spirit überlädt 'op,', um einen ähnlichen Effekt wie bei Boost.Assign für die Initialisierung von Symboltabellen zu erzielen.

    Und zu guter Letzt: *ich* überlade ihn, wenn ich Funktionen mit einer variablen Anzahl an Parametern benötige, denn 'va_args' ist mir suspekt. (Aber zugegeben: In der Praxis habe ich in C++ noch nie variable Parameteranzahlen benötigt).



  • CStoll schrieb:

    Da gibt's einen eingebauten Vorrang - das Trennzeichen in Argumentlisten ist nicht dein operator, (genauso wenig wie das Trennzeichen zwischen Variablendeklarationen).

    OK, vielen Dank,

    Simon2,


Anmelden zum Antworten