問題タブ [stdbind]

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 投票する
1 に答える
1502 参照

c++ - 2 つの異なる明示的なコンストラクターに暗黙的に変換可能な std::bind の戻り値の型

explicit2 つのコンストラクター オーバーロード (異なる型に基づく)が与えられstd::function<...>た場合、の戻り値はどちらかstd::bindを選択できます(それにより、呼び出しがあいまいになります)。

どちらかをコメントアウトすると、コードがコンパイルされます!

explicitコンストラクターを作成すると、正しいオーバーロードが選択されるか、両方が選択されないようになると思いましたか?

もちろん、バインドした時点で明示的にa を作成すると、次のように機能します。std::function

しかし、なぜ型推論が機能しないのか、私は戸惑っていますか?

  • からの戻り値std::bindが 2 つのコンストラクター シグネチャのいずれにも一致しない場合、それらがexplicit両方とも選択されないようにする必要があります。
  • からの戻り値std::bindが 2 つのコンストラクター シグネチャのいずれかに一致する場合、それらが一致するという事実explicitにより、正しいものが選択されるはずです。

ここで実際に何が起こっているのですか?

以下の完全な作業コード:

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

function - std::bind を使用して、仮想関数の親のバージョンにバインドします

親クラスのバージョンの仮想およびオーバーライドされた関数の std::function オブジェクトを作成したいです。次の例を参照してください。

への呼び出しchild.func1()は期待どおりに動作しますが、への呼び出しchild.func2()は無限再帰になり、バインドするつもりだったのではなく、parent_func2()呼び出しているように見えます。Child::func2()Parent::func2()

どうすればparent_func2()本当に電話できるのParent::func2でしょうか?

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

c++11 - std::bind とラムダを使用したバインディング。それらはどれくらい高価ですか?

私はバインドで遊んでいて、考えていました.ラムダは関数ポインタと同じくらい高価ですか?

つまり、ラムダを理解しているように、それらはファンクターの構文糖衣であり、バインドは似ています。ただし、これを行う場合:

ここで、 1st を使用すると、次auto bound = std::bind(fn2, a, b);の出力が得られます

3、4

1、2

、私が得る2番目
3、4

3、4

. 3番目と4番目は、1番目と同じように出力されます。

これで、1 番目と 2 番目がそのように機能する理由がわかりました。関数呼び出しの開始時に初期化されます (静的なもので、最初に呼び出されたときのみ)。ただし、3 と 4 では、生成されたファンクターが囲んでいるスコープの変数への参照を実際に作成するのではなく、最初だけまたは毎回初期化されるかどうかに関係なく、実際にシンボルにラッチしているコンパイラ マジックが進行しているようです。

誰かがここで実際に何が起こっているのかを明確にすることができますか?

編集:私が欠けstatic auto bound = std::bind(fn2, std::ref(a), std::ref(b));ていたのは、4番目のオプションとして機能させるために使用していました。

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

c++ - std::vector c++ から std::function を呼び出すとクラッシュする

これを行うと、このエラーが発生します

実行時チェックの失敗 #0 - ESP の値が関数呼び出しで適切に保存されませんでした。これは通常、ある呼び出し規約で宣言された関数を、別の呼び出し規約で宣言された関数ポインターで呼び出した結果です。

呼び出すときdutyStack[0]();。しかし、追加dutyStack.reserve(10);した場合、またはベクトルに要素が 1 つしかない場合、エラーは発生しません。ベクトルのサイズを変更するときに要素をコピーしているときに何かが起こっていると思われますが、実際にはわかりません。

私はビジュアルスタジオ2008、Windows 7の下にいます。

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

c++ - std::bind をパラメータ パックのパラメータにできないのはなぜですか?

パラメータパックを使いたいのですが、問題が見つかりました。いくつかのコード:

これはすべてうまくいきます:

しかし、std::function をパラメーター パックに渡したい場合:

アプリケーションはコンパイルされなくなります。

では、パックのパラメータとして関数を使用する問題は何ですか?

ありがとう。

更新: f のコードを次のように変更した場合:

うまく機能しますが、ここでこの関数を実行したくありません。関数を作成して、param のように渡したいのです。

UPDATE2: コード実行例: http://ideone.com/gDjnPq

UPDATE3: コンパイル エラーでコードをクリア: http://ideone.com/50z7IN

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

c++ - std::bind の結果で std::function を構築するときにスタック オーバーフローが発生しました

私は単純なライブラリを作成std::functionし、ライブラリ ユーザーのコールバックとして使用しています。

f4コールバック関数を簡素化するようなものが欲しいです。

std::bind内部事情に詳しくありません。

なぜf3構築できなかったのf4ですか?

私は使っている

clang++ : Apple LLVM バージョン 5.0 (clang-500.2.79) (LLVM 3.3svn ベース)

OSX10.9 macbook で

でコンパイル:

clang++ -g -std=c++0x test.cpp

f4 でのスタック オーバーフローは、流れるものの無限呼び出しによるものです。

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

c++11 - std::bind() 結果のアリティおよびその他の特性を決定するための標準的な方法は?

コールバック メカニズムの登録を実行するためのクリーンなパブリック インターフェイスをクラスに持たせる方法を見つけようとして、数日間頭を悩ませていました。コールバックは、C++11 ラムダ、、、、std::function<void(Type1,Type2)>またはの結果にすることができます。std::function<void(Type2)>std::function<void()>std::bind()

このインターフェイスの重要な点は、クラスのユーザーが、ユーザーがスローする可能性のあるほぼすべてのファンクター/コールバック メカニズムを受け入れる 1 つのパブリック インターフェイスについて知っているだけでよいということです。

ファンクターとインターフェースの登録を示す簡略化されたクラス

enable_if<> の使用が複雑になる唯一の理由は、特定のメソッドをオン/オフすることです。これを行う必要があるのは、 std::bind() の結果を Register() メソッドに渡したい場合で、次のような単純な署名がある場合、複数の登録メソッドに対してあいまいに一致する可能性があるためです。

車輪を再発明するのではなく、traits.hppを参照してから、std::bind() のサポートを追加する「functor_traits」という名前の独自の特性ヘルパーでラップしました。

これは、バインドされた関数「アリティ」を識別するためにこれまでに思いついたものです...またはバインド結果が次のように期待する引数の数:

バインド結果のアリティを見つけようとする私の試み

この実装は libstdc++ を使用して gcc で動作しますが、std::bind() の結果を分解しようとするため、これが移植可能なソリューションであるかどうかはよくわかりません。 libstdc++ のユーザーとして行う必要はありません。

だから私の質問は次のとおりです: std::bind() の結果を分解せずに、バインド結果のアリティをどのように決定できますか? 制限付き引数を可能な限りサポートする function_traits の完全な実装をどのように実装できますか ?