-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();
}
}
};
例えばmouse_click、on_focus_gainedなどさまざまなイベントのために また追加のサポート...。コールバックのタイプを変換可能なものに変更する必要があります。 – Holt
何をキャプチャする必要が完全に不明です。一般的なキャプチャの構文に関する質問ですか、特定のケースについては不明ですか?それが前者の場合は、文書を参照する必要があります。後者の場合は、明確なコードを投稿してください。 – SergeyA
@Holt、非キャプチャラムダは関数ポインタに変換できます。 – SergeyA