C++ ButtonCallBack Function Typedef & Lamba



  • Hallo zusammen,
    folgendes Problem ist bei mir aufgetreten:

    Ich will in meinem Button einen Funktions-Pointer speichern, der dann ausgeführt wird, wenn der Button ein Event rein-bekommt...

    class HUDButton 
    
    typedef void(*HUDButtonClickFun) (HUDButton*);
    
    private:
    	HUDButtonClickFun m_clickFun;
    
    void setClickCallback(HUDButtonClickFun fun){ m_clickFun = fun; }
    void removeClickCallback() { m_clickFun = nullptr; }
    
    void onClick(HUDButton* button){
    	if (m_clickFun != nullptr) m_clickFun(button);
    }
    

    Was ich will: capture-Referenzen an ein Lambda übergeben:

    HUDButton* button = new HUDButton();
    button->setClickCallback( [frame](HUDButton* hudButton) { ...  } );
    
    

    Das Problem dabei ist, durch des typedef kann ich keine capture-Referenzen an ein Lambda übergeben:

    button->setClickCallback( [](HUDButton* hudButton) { ... } );
    

    Kann ich das typedef irgendwie abändern, so dass der Lambda Ausdruck akzeptiert wird?
    // Edit: statische Maps sind keine Option.

    Danke im Voraus.
    rnholzinger01 :smiling_face_with_open_mouth:



  • Das geht mit einem Funktionszeiger nicht. Du brauchst hier ein std::function<void(HUDButton*)>. Das kann per type erasure unterschiedliche "callables" speichern, z.B. Funktionszeiger oder Lambdas.



  • @mechanics sagte in C++ ButtonCallBack Function Typedef & Lamba:

    Das geht mit einem Funktionszeiger nicht. Du brauchst hier ein std::function<void(HUDButton*)>. Das kann per type erasure unterschiedliche "callables" speichern, z.B. Funktionszeiger oder Lambdas.

    Okay, vielen Dank. Werde es gleich versuchen.