2016-04-18 11 views
-1

私はこのクラスを有するC++ラムダコールバック - 変数を取り込む方法は?

typedef void(*callback)(); 

class Button : public Control 
{ 
private: 
    callback onClickCallback; 

public: 
    void bind(callback func) 
    { 
     onClickCallback = func; 
    } 

    void onClick() 
    { 
     onClickCallback(); 
    } 
}; 

ボタンは、GUIクラスの構成要素としてマッピングされた制御を継承します。 Guiクラスには、リスト上のすべてのコンポーネントのonClickメソッドを呼び出すメソッドがあります。 onClickメソッドのコールバックは、ここでラムダ式

Gui gui; 
gui.addControl<Button>(x, y, width, height).bind([] { 
    MessageBox(NULL, "OK", "OK", 0); 
    //How to capture gui 
    //Eg add another button on click: 
    //gui.addControl<Button>(x, y, width, height); 
}); 

が、これは適切なソリューションであるならば、私は実際にそれが、私は知りませんでしたが、それは動作するようですGUIクラス

class Gui 
{ 
private: 
    int index; 
    std::unordered_multimap<int, Control*> controls; 

public: 
    template <typename T, typename ...Args> 
    T& addControl(Args... args) 
    { 

     auto control = new T{ std::forward<Args>(args)... }; 
     std::pair<int, Control*> pair(index, control); 
     controls.insert(pair); 
     index++; 

     return *control; 
    } 

    void processMessages() 
    { 
     for (auto it = controls.begin(); it != controls.end(); ++it) 
     { 
      it->second->onClick(); 
     } 
    } 
}; 
+1

例えばmouse_click、on_focus_gainedなどさまざまなイベントのために また追加のサポート...。コールバックのタイプを変換可能なものに変更する必要があります。 – Holt

+0

何をキャプチャする必要が完全に不明です。一般的なキャプチャの構文に関する質問ですか、特定のケースについては不明ですか?それが前者の場合は、文書を参照する必要があります。後者の場合は、明確なコードを投稿してください。 – SergeyA

+2

@Holt、非キャプチャラムダは関数ポインタに変換できます。 – SergeyA

答えて

0

です。

Buttonクラスが更新されました。

class Button : public Control 
{ 
private: 
    std::function<void()> onClickCallback; 

public: 
    //Override 
    void bind(std::function<void()> func) 
    { 
     onClickCallback = func; 
    } 

    //Override 
    void onClick() 
    { 
     onClickCallback(); 
    } 
}; 

今すぐ動作します。あなたが関数ポインタをキャプチャして、ラムダを変換することはできません

gui.addControl<Button>(hWnd, "Button", 3, 26, 70, 23).bind("mouse_click", [&] { 
    gui.getControl<Button>(0).setText("Clicked"); 
}); 
関連する問題