そこにあるC++GUIツールキットは、C ++ 11ラムダ式としてのコールバック関数の定義をサポートしていますか?これは、GUIベースのプログラムを作成するためにC#を使用する(少なくともC ++と比較して)ユニークな利点だと思います。ラムダ式を引数として取る関数にはどの型アノテーションを使用する必要がありますか?また、これらは暗黙的な変換をどのようにサポートしますか?
4 に答える
質問の2番目の部分への答え:クロージャのないラムダは適切な関数型に変換可能でなければならないため、std::function<Signature>
where Signature
=egvoid (int)
または-ラムダがクロージャを受け取らない場合は-古き良き方法を使用できます。void (Foo*)(int)
したがって、たとえば、署名付きのメソッドの呼び出し:
void AddHandler(std::function<void (int)> const &);
このように見える可能性があります:
myObject.AddHandler([&](int _) {
// do something and access captured variables by reference
});
そこにあるC++GUIツールキットは、C ++ 11ラムダ式としてのコールバック関数の定義をサポートしていますか?
関数ポインタを受け入れる場合は、少なくとも何もキャプチャしないラムダを使用できます。このようなラムダは、関数ポインターに自動的に変換できます。
ラムダ式を引数として取る関数にはどの型アノテーションを使用する必要がありますか?また、これらは暗黙的な変換をどのようにサポートしますか?
人々にラムダまたは呼び出し可能なオブジェクトを使用させたい場合は、APIにstd :: functionオブジェクトを受け入れるか、テンプレートを使用することができます。
template<typename Callback>
void do_it(Callback c) {
c();
}
do_it([&]{ c = a+b; });
テンプレートを使用すると、std :: functionに間接参照が必要なときに、ラムダをインライン化できます。これは、GUIコールバックではそれほど重要ではない場合があります。
要件を満たす新しい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/
楽しむ!