2012-04-05 16 views
4

そこにあるC++ GUIツールキットは、C++ 11ラムダ式としてコールバック関数の定義をサポートしていますか?私はこれが、GUIベースのプログラムを書くためのC#(少なくともC++と比較して)を使用する独特のプロですと信じています。ラムダ式を引数とする関数にどのような型シグネチャを使用すればよいでしょうか?これらが暗黙の変換をどのようにサポートしていますか?C++ 11コールバック関数としてのラムダ式

+0

[this](http://www.boost.org/libs/signals2/)や[this](http://www.boost.org/)など、_any_ signals/slotsライブラリを参照してください。 libs/signals /)、または[this](http://www.chaoticmind.net/~hcb/projects/libtscb/)を参照してください。このパターンはGUIと完全に直交していますが、GUIはパターンが一般的に使用される場所です。 – ildjarn

答えて

3

は、C++ 11のようにコールバック関数の存在支援の定義を任意のC++ GUIツールキットを出していラムダ式?

もし関数ポインタを受け入れるなら、少なくとも何も捕らえないラムダを使うことができます。このようなラムダは自動的に関数ポインタに変換されます。

ラムダ式を引数とする関数にはどのような型シグネチャを使用する必要がありますか。これらは暗黙の変換をどのようにサポートしますか?

あなたは、人々がラムダまたは任意の呼び出し可能オブジェクトを使用したい場合、あなたは、あなたのAPIがのstd ::関数オブジェクトを受け入れる必要があり、またはテンプレートを使用でき、次のいずれかのテンプレートを

template<typename Callback> 
void do_it(Callback c) { 
    c(); 
} 

do_it([&]{ c = a+b; }); 

をラムダができるようになりますstd :: functionがインダイレクションを必要としている間はインライン化してください。これは、GUIコールバックにとってはあまり重要ではないかもしれません。

+12

ここで有向グラフを使用する理由は何ですか?不必要に混乱しているようです。 – juanchopanza

+0

二重グラフを避けてください – dats

6

質問の第2部への回答:std::function<Signature>の場合、Signature = void (int)または - ラムダがクロージャを取らない場合 - 良い古いvoid (Foo*)(int)メソッド、クロージャのないラムダは適切な関数型に変換可能でなければならないためです。そのため、たとえばシグネチャを持つメソッドの呼び出し:

void AddHandler(std::function<void (int)> const &); 

は、次のようになります。

myObject.AddHandler([&](int _) { 
    // do something and access captured variables by reference 
}); 
2

要件を満たす新しいGUIツールキットがあります。開発効率を向上させるための多くの機能を提供しようとしています。

ライブラリの紹介です。 http://nanaproject.wordpress.com/2011/12/16/preliminary-study-of-nana-c-library/

ライブラリとstd :: bindを併用して複雑さを軽減する方法を説明する記事。 http://nanaproject.wordpress.com/2012/01/31/idioms-and-insights-for-a-good-design/

楽しくお楽しみください!

0

C++ 11のテンプレートライブラリでは、GUIがラムダをサポートしているかどうかは関係ありません。あなたは、メッセージで必要なものを実行するためのGUIを作成し、ドメインロジック側で同じコードを保持することができます。 taming Qtとこれらのexamplesに関するこの記事をご覧ください。

関連する問題