operator,



  • 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