問題タブ [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 投票する
3 に答える
1015 参照

c# - C++ の std::function のようなメンバー関数を渡す (C# のように)

オーバーロードされた += 演算子を使用して、C# に似たデリゲートを使用するテンプレート クラス Delegate があります。

これは私がやろうとしていることです:

d += test;仕事を許可する方法はありますか?

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

c++ - std::bind() 一時オブジェクトで明示的なキャストを避ける方法は?

std::bind の戻り値の型は (意図的に) 指定されていません。std::function に格納できます。

以下のサンプル プログラムは、fn1() を呼び出すために、std::bind() によって返された一時オブジェクトを std::function に明示的にキャストする方法を示しています。

std::bind の戻り値の型がわかっている場合、Callback コンストラクターをオーバーロードでき、std::bind 一時オブジェクトを明示的にキャストする必要がなくなります。

明示的なキャストを回避する方法はありますか?

おそらく関係ありませんが、Linux で gcc 4.7.2 を使用しています。

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

c++ - コンストラクターを介してマップするカスタムソート

std::map次の方法で、カスタムの並べ替え動作をに渡す方法がわかりません。

コンパレータをマップに渡すにはどうすればよいですか?

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

c++ - std::function 右辺値引数を取るメンバ関数へのポインタ MSVC2010 SP1

右辺値引数を取るメンバー関数にバインドされた std::function を作成したいと思います。これがコンパイルされない私の試みです(「xxfunction(154):エラーC2664:...特に、左辺値を右辺値参照にバインドできません」)。

私はいくつかの読書をしましたが、完全な転送を使用しない std::function に関係していると思いますが、それを機能させる方法がわかりません。

編集:

これはある程度実行可能な回避策ですが、pF の呼び出しは左辺値で機能し、とにかくそれを移動するため、完全ではありません。

0 投票する
8 に答える
62957 参照

c++ - std ::functionvsテンプレート

C ++ 11のおかげstd::functionで、ファンクターラッパーのファミリーを受け取りました。残念ながら、私はこれらの新しい追加について悪いことだけを聞き続けています。最も人気があるのは、彼らがひどく遅いということです。私はそれをテストしました、そして、彼らはテンプレートと比較して本当にひどいです。

111ミリ秒対1241ミリ秒。これは、テンプレートを適切にインライン化できる一方で、function仮想呼び出しを介して内部をカバーできるためだと思います。

明らかに、テンプレートには問題があります。

  • それらはヘッダーとして提供する必要がありますが、これは、ライブラリをクローズドコードとしてリリースするときに実行したくない場合があります。
  • extern template-likeポリシーが導入されていない限り、コンパイル時間が大幅に長くなる可能性があります。
  • テンプレートの要件(概念、誰か?)を表す(少なくとも私には知られている)クリーンな方法はありません。どのようなファンクターが期待されるかを説明するコメントを禁止します。

したがって、 sはパスファンクタのデファクトfunctionスタンダードとして使用でき、高性能が期待される場所ではテンプレートを使用する必要があると想定できますか?


編集:

私のコンパイラは、CTPを使用しないVisualStudio2012です。

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

c++ - C++ std::bind / std::function を使用してテンプレート化された関数を参照する方法

テンプレート化されたクラスまたはテンプレート化された関数 (またはその 2 つの組み合わせ) がある場合、その関数をどのようにバインドしますか (テンプレート型パラメーターを保持します)。

以下の投稿で、明示的なテンプレート型パラメーターを使用して関数にバインドするための基本的な構文について、いくつかの助けがありましたが、プロセスでテンプレート型パラメーターを提供する機能を失いました。

今後の呼び出しでテンプレート型パラメーターを提供できるように、これを機能させることは可能ですか?

このコードを大幅にクリーンアップしましたが、正しい構文が見つからないため、明らかにコンパイルされません (これを行う方法はありますか)?

これを簡素化するために「ベクトル」要件を削除しました。

助けてくれてありがとう!

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

c++ - ラムダを引数として渡そうとしています

ラムダをコンストラクターに渡そうとしています:

コンパイルすると、次のエラーメッセージが表示されます。

0 投票する
2 に答える
2258 参照

c++ - std::set の並べ替えに使用される C++11 std::function および std::reference ラッパー

C++ クラスがあり、そのフィールドの 1 つはオブジェクトの std::set です。独自の比較関数を作成するか、ユーザーに指定させたい。C++11 では、汎用関数型を処理する新しい方法 std::function があります。関数ポインター、メンバー関数ポインター、ラムダ関数などで動作します。

簡単な実験プログラムを作成しようとしましたが、C++11 Wikipedia の記事が示唆していることを実行しても、常にクラッシュし続けます。std::function と std::ref がどのように使用されることになっているのかわからないだけかもしれません。

とにかく、ポイントは、単純なラムダ関数から std::function を作成し、それをクラス メンバーにしたときに、クラスの sizeof が 22 増加したことです。グローバル関数へのポインターから std::function を作成したとき、この std::function の sizeof は 32 でした。したがって、サイズは大きいです。同じ比較関数を使用するオブジェクトが多数あるので、それらすべてで 1 つの関数を使用することを好みます。

2つの考えがあります、あなたの考えを教えてください。1 つのアイデアは、std::ref を使用して関数への参照を格納することです。このようにして、1 つの関数を定義でき、多くのオブジェクトがそれを使用して std::set 要素を比較します。2 番目のアイデア: そのように機能しない場合、または結果の関数オブジェクトがとにかく大きすぎる場合は、shared_ptr を使用できます。

あなたは疑問に思うかもしれません: 静的な std::function メンバーが 1 つないのはなぜですか? 答え: すべてのオブジェクトが同じ比較関数を使用するためです。たとえば、ある比較関数を使用して 400 個、別の比較関数を使用して 600 個のオブジェクトを 1000 個持つことができるようにしたいと考えています。

例:

std::set で std::function を使用し、多くの MyClass オブジェクトで同じ関数を使用するにはどうすればよいでしょうか。

実行時に比較関数を変更できるようにして、ユーザーがセット内のオブジェクト (GUI で表示される) の順序を選択できるようにしたいと考えています。

0 投票する
6 に答える
60601 参照

c++ - C ++ 11 std::setラムダ比較関数

std::setカスタム比較関数でを作成したい。でクラスとして定義することもできますがoperator()、ラムダを使用する場所で定義できる機能を楽しみたかったので、をstd::setメンバーとして持つクラスのコンストラクターの初期化リストでラムダ関数を定義することにしました。しかし、ラムダのタイプを取得できません。先に進む前に、次に例を示します。

検索したところ、2つの解決策が見つかりました。1つは、を使用したものstd::functionです。setの比較関数型をbestd::function<bool (int, int)>にして、私が行ったのとまったく同じようにラムダを渡します。2番目の解決策は、のようなmake_set関数を作成することですstd::make_pair

解決策1:

解決策2:

問題は、一方のソリューションをもう一方のソリューションよりも優先する正当な理由があるかどうかです。私は最初のものを好みます。なぜならそれは標準機能を利用しているからです(make_setは標準関数ではありません)が、私は疑問に思います:使用std::functionするとコードが(潜在的に)遅くなりますか?つまり、コンパイラが比較関数をインライン化する可能性を低くしますか、それともラムダ関数タイプであるのとまったく同じように動作するのに十分スマートである必要がありますstd::function(この場合、ラムダタイプですが、ご存知のとおり、私は一般的に質問しています)?

(私はGCCを使用していますが、一般的なコンパイラーが一般的に何をするのか知りたいです)

要約、私がたくさんの素晴らしい答えを得た後:

operator()速度が重要な場合、最善の解決策は、別名ファンクターを備えたクラスを使用することです。コンパイラが最適化して間接を回避するのが最も簡単です。

C ++ 11機能を使用して、メンテナンスを容易にし、より優れた汎用ソリューションを実現するには、を使用しますstd::function。それでも高速で(ファンクターよりも少し遅いですが、無視できるかもしれません)、任意の関数std::function(ラムダ、呼び出し可能オブジェクト)を使用できます。

関数ポインタを使用するオプションもありますが、速度の問題がない場合は、より良いと思いますstd::function(C ++ 11を使用する場合)。

ラムダ関数を別の場所で定義するオプションがありますが、比較関数がラムダ式であることからは何も得られません。これは、それをクラスにすることもできoperator()、定義の場所はとにかくセット構造ではないためです。

委任を使用するなど、さらに多くのアイデアがあります。すべての解決策のより完全な説明が必要な場合は、回答を読んでください:)