Properties in C++



  • Shade Of Mine schrieb:

    Nein, Lambda Ausdrücke sind semantisch etwas anderes - sie lassen sich ja auch komplett anders implementieren als Funktionszeiger. Bieten somit dem Compiler auch ganz andere Optimierungsmöglichkeiten.

    Trotzdem ist ein Lambda doch nur eine Kurzschreibweise für einen Funktor?

    dot schrieb:

    Nun, der Punkt ist ja, dass sie den Code eben nicht schöner machen, sondern schlechten Stil propagieren... 😉

    Kannst du erklären was du damit meinst?

    Ich habe oft Sachen wie zum Beispiel:

    class A
    {
    	int value; // Immer größer als 0
    public:
    	int getValue() const { return value; }
    	void setValue(int newValue) { assert(newValue > 0); value = newValue; }
    };
    

    Wieso sollte das schlecht sein?


  • Mod

    happystudent schrieb:

    Trotzdem ist ein Lambda doch nur eine Kurzschreibweise für einen Funktor?

    Ja, aber Compiler haben spezielle Verfahren um Lambdas zu optimieren. Bspw. können in einigen Szenarien die Captures weggelassen werden und stattdessen nur der ESP gespeichert.



  • Arcoth schrieb:

    Ja, aber Compiler haben spezielle Verfahren um Lambdas zu optimieren. Bspw. können in einigen Szenarien die Captures weggelassen werden und stattdessen nur der ESP gespeichert.

    Hm, aber ist das nicht ein Implementierungsdetail?

    Oder anders gefragt: Der Compiler könnte diese Optimierung dann ja wahrscheinlich auch mit einem entsprechend implementierten Funktor durchführen. Dass er es nicht macht ist dann aber kein Vorteil von Lambdas an sich.

    Oder gibt es dafür irgendwelche speziellen Gründe dass diese Optimierungen nur mit Lambdas überhaupt erst theoretisch möglich sind?


  • Mod

    happystudent schrieb:

    Dass er es nicht macht ist dann aber kein Vorteil von Lambdas an sich.

    Doch, genauso wie es ein Vorteil von range-based for ist, dass der end-Iterator zwischengespeichert wird. Wenn dadurch Optimierung erleichtert wird, ist das ein nennenswerter Gewinn.



  • Also wenn man z.B. folgenden Code hat:

    void foo() {
        int i;
        auto add = [&i](int j) { i += j; };
        ...
    }
    

    Dann habe ich das als Syntax Sugar gesehen für (ungefähr)

    void foo() {
        int i;
    
        struct interner_name {
            int &iref;
            interner_name(int &iref) : iref(iref) {}
            void operator()(int j) { iref += j; }
        };
        interner_name add(i);
        ...
    }
    

    Welche Optimierungen sind jetzt im ersten Beispiel möglich, die im zweiten nicht möglich sind?

    Ich möchte die Diskussion übrigens nicht in Richtung Lambdas abtriften lassen, aber der Punkt interessiert mich wirklich.



  • lambdas ohne capturing kannst du als function_pointer verwenden.
    in deinem fall, kannst du ein klasse/struct local definieren und verwenden.
    wenn du allerdings z.b. die winapi verwendest, wo viel mit callbacks ueber function_pointers realsiert ist, dann kannst du natuerlich keine lokale funktion dafuer schreiben



  • Meep Meep schrieb:

    lambdas ohne capturing kannst du als function_pointer verwenden.

    Das kannst du mit dem lokalen struct auch. Einfach die Methode statisch machen.



  • stimmt. war mir eicht entfallen.
    also auch wieder nur zucker



  • Ich mache das so:

    __declspec(property(get = getMyValue, put = setMyValue)) int value;
    

    dann kann ich das einfach verwenden:

    myObj->value = 10;
    cout << myObj->value; << endl;
    


  • @Farbfinsternis
    Dir ist schon klar dass das eine Extension von Visual C++ ist, die mit Standard C++ nix zu tun hat?
    (Und die mit Standardmitteln auch nicht nachgebildet werden kann.)



  • Ja, ist mir klar 🙂



  • Farbfinsternis schrieb:

    dann kann ich das einfach verwenden:

    myObj->value = 10;
    cout << myObj->value; << endl;
    

    Und wo ist da jetzt der Vorteil zu:

    cout << myObj->value();
    

    ausser dass der Leser panisch denkt: "SchXXXe: public variables" und das Ganze garantiert nur noch mit bestimmten Compilern übersetzbar ist?



  • Es wurde nach Properties gefragt und nicht nach Gettern.


Anmelden zum Antworten