Function pointers ?



  • cooky451 schrieb:

    ...(Edit: Quasi nie? Mir fällt gerade jedenfalls nichts ein.)

    Um std::bind und std::function zu implementieren. 🤡



  • Aber da ist es doch viel angenehmer virtual methods zu benutzen.

    Aber meist ist ein separates Objekt unnoetig.

    Benutzt ihr function pointers ? Und wenn ja , wann und warum ?

    Ja ich benutzte Funktionszeiger. Beispielsweise um der Sortierfunktion eine eigene Vergleichsfunktion mitzugeben.



  • Tachyon schrieb:

    Um std::bind und std::function zu implementieren. 🤡

    Edit: Moment mal, ne. Sind auch nur Templates, wie in meinem Beispiel. "bar" könnte da auch ein Funktionszeiger sein, aber ich hab's nicht dazu gezählt, da ich es lieber als "irgendetwas Callbares" sehe.



  • cooky451 schrieb:

    Tachyon schrieb:

    Um std::bind und std::function zu implementieren. 🤡

    Edit: Moment mal, ne. Sind auch nur Templates, wie in meinem Beispiel. "bar" könnte da auch ein Funktionszeiger sein, aber ich hab's nicht dazu gezählt, da ich es lieber als "irgendetwas Callbares" sehe.

    Ich meinte die Interna von function und bind . Da müssen ja irgendwie Methoden- und Funktionszeiger gespeichert werden.



  • Tachyon schrieb:

    Ich meinte die Interna von function und bind . Da müssen ja irgendwie Methoden- und Funktionszeiger gespeichert werden.

    Nope, die speichern einfach nen Typ T. Deswegen funktioniert bind ja auch mit Funktoren und nicht nur mit Funktionen. (Natürlich kann ein konkretes T u.U. ein Funktionszeiger sein, aber erstmal sieht man das nicht.)



  • Für Callbacks vielleicht?



  • cooky451 schrieb:

    Tachyon schrieb:

    Ich meinte die Interna von function und bind . Da müssen ja irgendwie Methoden- und Funktionszeiger gespeichert werden.

    Nope, die speichern einfach nen Typ T. Deswegen funktioniert bind ja auch mit Funktoren und nicht nur mit Funktionen. (Natürlich kann ein konkretes T u.U. ein Funktionszeiger sein, aber erstmal sieht man das nicht.)

    Methodenzeiger sind aber keine Funktoren. Die muss bind also gesondert behandeln.
    bind hat Überladungen für verschiedene Funktionstypen, um zum Beispiel den Rückgabetyp herzuleiten.



  • cooky451 schrieb:

    Tachyon schrieb:

    Ich meinte die Interna von function und bind . Da müssen ja irgendwie Methoden- und Funktionszeiger gespeichert werden.

    Nope, die speichern einfach nen Typ T. Deswegen funktioniert bind ja auch mit Funktoren und nicht nur mit Funktionen. (Natürlich kann ein konkretes T u.U. ein Funktionszeiger sein, aber erstmal sieht man das nicht.)

    Ähm, gibts da nicht Spezialisierungen für alles Mögliche? Zum Beispiel bei bind für freie Funktionen? Wie soll man das ohne Funktionszeiger implementieren?

    Oder bei sowas:

    void foo(){}...
    std::function<void ()> functor(&foo);
    

    Was soll den std::function da speichern, wenn nicht einen Funktionszeiger?





  • Kellerautomat schrieb:

    http://ideone.com/fNJ18
    blubb

    Funktioniert bei mir nicht. Ich benutze noch C++2003. Wie machst Du es da? Okay, aber ich sehe, mit C++11 kommt man auch ohne FPs aus. Find ich gut.



  • In C++03 ists halt kein Variadic Template. Ansonsten funktioniert das da genau gleich.



  • Kellerautomat schrieb:

    In C++03 ists halt kein Variadic Template. Ansonsten funktioniert das da genau gleich.

    Da hast Du auch keine Rvalue-Refs und dementsprechend kein move. Ohne gehts aber nicht, so wie Du es gezeigt hast. Achso, und Dein Teil ist nicht kopierbar, wenn ich das richtig sehe. Aber nicht kopierbare Delegates sind ziemlich doof.



  • Ich war zu faul, kopierbarkeit einzubauen. Bleibt dir als Übung überlassen.


Anmelden zum Antworten