問題タブ [std-function]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
6530 参照

c++ - std :: functionのテンプレート引数(署名)はそのタイプの一部ではありませんか?

次のコードを考えると、あいまいさの背後にある理由は何ですか?それを回避することはできますか、それとも(迷惑な)明示的なキャストを維持する必要がありますか?

a()興味深いことに、パラメーターを使用して関数をコメントアウトし、mainfunction<int ()>を呼び出すと、使用可能な唯一の関数の型と引数a(x)の型が一致しないため、コンパイルが正しく失敗します。その場合にコンパイラが失敗した場合、2つの関数が存在するときにあいまいさが生じるのはなぜですか?xfunction<int (int)>a()a()

VS2010とg++v。4.5で試しました。どちらもまったく同じあいまいさを与えてくれます。

0 投票する
4 に答える
113028 参照

c++ - std::function と std::bind: それらは何ですか? また、いつ使用する必要がありますか?

ファンクターとは何か、アルゴリズムでいつ使用するかは知っていますstdが、Stroustrup がC++11 FAQでファンクターについて何を言っているのか理解できません。

誰が何std::bindstd::functionいつ使用すべきかを説明し、初心者向けの例をいくつか挙げることができますか?

0 投票する
4 に答える
4450 参照

c++ - 関数型パラメーターを使用した C++ テンプレートの構文

関数ポインターのこのような構文を見るのに慣れています

一部の C++03 機能ライブラリでは、型が次のように使用されているのを目にします。

C++11 ではstd::function、このように指定された型が表示されます

欠けがあり(*)ます。なんで?

C++03function<T>T、対応する関数ポインタと同じ型になっています。実装を想像するのは簡単です。

std::functionin C++11 は、コア言語の拡張機能によってサポートされています。呼び出し可能性に対応するために、テンプレート引数の型が拡張されていますか?

0 投票する
7 に答える
14967 参照

c++ - std::function インスタンスにデフォルトのコンストラクタがあるのはなぜですか?

これはおそらく哲学的な質問ですが、次の問題に遭遇しました。

std::function を定義し、それを正しく初期化しないと、アプリケーションは次のようにクラッシュします。

関数が引数として渡される場合、次のようになります。

もちろん、それもクラッシュします。これは、次のようなチェック コードを追加する必要があることを意味します。

これらのチェックを要求すると、すべてのポインター引数を明示的にチェックする必要もあった古い C 時代にフラッシュバックします。

幸いなことに、C++ で参照を使用できるため、これらのチェックを書くことができません (呼び出し元が nullptr の内容を関数に渡さなかったと仮定すると:

では、なぜ std::function インスタンスにデフォルトのコンストラクターがあるのでしょうか? デフォルトのコンストラクターがなければ、関数の他の通常の引数と同様に、チェックを追加する必要はありません。また、「オプションの」 std::function を渡したい「まれな」ケースでは、ポインタを渡すこともできます (または boost::optional を使用します)。

0 投票する
1 に答える
2362 参照

c++ - shared_ptrとweak_ptrを使用してstd::functionの存続期間を安全に管理していますか?

OpenGLアプリケーションのGUIスレッドで非同期タスクを処理するために、boost :: asio::io_serviceのラッパーを作成しました。

タスクは他のスレッドから作成される可能性があるboost::asioため、この目的には理想的であり、ミューテックスとロックを関連付けて独自のタスクキューを作成する必要がないことを意味します。各フレームで行われる作業を許容可能なしきい値(たとえば5ms)未満に保ちたいので、をpoll_one呼び出すのではなく、目的の予算を超えるまで呼び出しrunます。私が知る限り、これにはreset新しいタスクが投稿されるたびに電話をかける必要があり、これはうまく機能しているようです。

短いので、これが全部です、さん#include

メインのアプリクラスにUiTaskQueueRefのインスタンスを保持しmUiTaskQueue->update()、アプリのアニメーションループ内から呼び出します。

このクラスの機能を拡張して、タスクをキャンセルできるようにしたいと思います。以前の実装(ほぼ同じインターフェイスを使用)は、各タスクの数値IDを返し、このIDを使用してタスクをキャンセルできるようにしました。しかし、現在、キューの管理と関連するロックは、boost::asioこれを行うための最善の方法がわかりません。

キャンセルしたいタスクをでラップし、タスクにshared_ptrを格納しweak_ptr、演算子を実装して()に渡すことができるラッパーオブジェクトを作成してみましたio_service。次のようになります。

次に、pushTask次のようなメソッドのオーバーロードがあります。

次に、以下を使用してキャンセル可能なタスクをキューに投稿します。

または、必要にVoidFunc応じてtypedefを使用します。

shared_ptrmTask周りにいる限りio_service、はタスクを実行します。私が呼び出すresetmTaskweak_ptrロックできず、タスクは必要に応じてスキップされます。

私の質問は、これらすべての新しいツールに対する自信の1つです。実行しても問題はnew std::function<void(void)>( std::bind( ... ) )なく、安全に管理できるのshared_ptrでしょうか。

0 投票する
1 に答える
654 参照

c++ - std::function: 引数のコンパイル時の厳密な検証

定義済みの関数シグネチャを持つ 2 つのコールバックを保持するクラスを実装したいと思います。

このクラスには、std::bind を使用して std::function メンバーを作成するテンプレート化された ctor があります。間違った署名の関数が ctor に渡されると、コンパイラ (g++ 4.6) が文句を言うだろうと思っていました。ただし、コンパイラは次を受け入れます。

なぜそうなるのか理解できます。static_assert の適切な条件を構築しようとしましたが、成功しませんでした。

これを防ぐためにコンパイル時エラーを発生させるにはどうすればよいですか?

更新:訪問者からの回答は、私の最初の問題を解決します。残念ながら、解決すべき関連するケースがたくさんあります。これらは、次のコード ( http://ideone.com/P32sU )で示されています。

関数のシグネチャは有効ですが、訪問者によって提案された static_assert がこの場合にトリガーされます。

関数の引数と戻り値を比較するだけでよいと思います。方法を提案してください。

ありがとうございました。

0 投票する
3 に答える
1420 参照

c++ - メソッドポインタからジェネリック関数ポインタを動的に作成し、戻り値とパラメータを推定します

静的C関数を期待するコードのメンバーメソッドを呼び出すために使用するこのヘルパークラスがあります。この特定の「バージョン」は、Windows LPTHREADROUTINEコールバックと互換性があり、DWORD (class::method) (void *)次のように呼び出される関数をパラメーターとして受け取ります。

全体を一般的にしたいと思っています。新しいC++11標準で実行できることはわかっていますが、それを実現することはできません。

MakeThreadInfo関数のインターフェイスを次のように変更してみました。

これが道のりのように思えますが、この値をアップストリームに渡すことができませんでした。


これが私が得たいものです:

MyMethodメソッドを持つクラスMyClassと、変数returnタイプのコールバック、およびさまざまなタイプの1つ以上のパラメーター(最後はvoid *userData)が与えられた場合、ボイラープレーティングをできるだけ少なくして、コールバックに何かを渡すにはどうすればよいですか?次に、MyClass::MyMethodを呼び出します。

説明する:

の有効な実装はCreateGenericCPointer何ですか?

0 投票する
5 に答える
49788 参照

c++ - std :: functionをコピーする必要がありますか、それとも常に参照することができますか?

私のC++アプリケーション(Visual Studio 2010を使用)では、次のようにstd::functionを格納する必要があります。

ご覧のとおり、コンストラクターの参照として関数の引数を追加しました。

しかし、私のクラスに関数を格納するための最良の方法は何ですか?

  • std :: functionは単なる関数ポインタであり、関数の「実行可能コード」はメモリに残ることが保証されているので、関数を参照として保存できますか?
  • ラムダが渡されて呼び出し元が戻ってきた場合に備えて、コピーを作成する必要がありますか?

私の直感では、参照(const-referenceでも)を保存しても安全だと言っています。コンパイラがコンパイル時にラムダのコードを生成し、アプリケーションの実行中はこの実行可能コードを「仮想」メモリに保持することを期待しています。したがって、実行可能コードが「削除」されることはなく、その参照を安全に保存できます。しかし、これは本当に本当ですか?

0 投票する
4 に答える
23416 参照

c++ - C++11可変個引数std::functionパラメーター

名前の付いた関数は、そのパラメーターとしてtest受け取ります。std::function<>

しかし、私が次のことをすると:

コンパイラ(gcc 4.6.1)は言いno matching function for call to test(void (&)(int))ます。

最後の行test(foo)をコンパイルして正しく機能させるには、関数を変更するにはどうすればよいtest()ですか?test()関数では、fタイプが必要ですstd::function<>

つまり、コンパイラに関数のシグネチャを決定させ(例)、それを自動的fooに変換するためのテンプレートトリックはありますか?std::function<void(int)>

編集

これをラムダ(ステートレスとステートレスの両方)でも機能させたいと思います。