問題タブ [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.
c++ - 2 つの異なる明示的なコンストラクターに暗黙的に変換可能な std::bind の戻り値の型
explicit
2 つのコンストラクター オーバーロード (異なる型に基づく)が与えられstd::function<...>
た場合、の戻り値はどちらかstd::bind
を選択できます(それにより、呼び出しがあいまいになります)。
どちらかをコメントアウトすると、コードがコンパイルされます!
explicit
コンストラクターを作成すると、正しいオーバーロードが選択されるか、両方が選択されないようになると思いましたか?
もちろん、バインドした時点で明示的にa を作成すると、次のように機能します。std::function
しかし、なぜ型推論が機能しないのか、私は戸惑っていますか?
- からの戻り値
std::bind
が 2 つのコンストラクター シグネチャのいずれにも一致しない場合、それらがexplicit
両方とも選択されないようにする必要があります。 - からの戻り値
std::bind
が 2 つのコンストラクター シグネチャのいずれかに一致する場合、それらが一致するという事実explicit
により、正しいものが選択されるはずです。
ここで実際に何が起こっているのですか?
以下の完全な作業コード:
function - std::bind を使用して、仮想関数の親のバージョンにバインドします
親クラスのバージョンの仮想およびオーバーライドされた関数の std::function オブジェクトを作成したいです。次の例を参照してください。
への呼び出しchild.func1()
は期待どおりに動作しますが、への呼び出しchild.func2()
は無限再帰になり、バインドするつもりだったのではなく、parent_func2()
呼び出しているように見えます。Child::func2()
Parent::func2()
どうすればparent_func2()
本当に電話できるのParent::func2
でしょうか?
c++11 - std::bind とラムダを使用したバインディング。それらはどれくらい高価ですか?
私はバインドで遊んでいて、考えていました.ラムダは関数ポインタと同じくらい高価ですか?
つまり、ラムダを理解しているように、それらはファンクターの構文糖衣であり、バインドは似ています。ただし、これを行う場合:
ここで、 1st を使用すると、次auto bound = std::bind(fn2, a, b);
の出力が得られます
3、4、私が得る2番目1、2
3、4. 3番目と4番目は、1番目と同じように出力されます。3、4
これで、1 番目と 2 番目がそのように機能する理由がわかりました。関数呼び出しの開始時に初期化されます (静的なもので、最初に呼び出されたときのみ)。ただし、3 と 4 では、生成されたファンクターが囲んでいるスコープの変数への参照を実際に作成するのではなく、最初だけまたは毎回初期化されるかどうかに関係なく、実際にシンボルにラッチしているコンパイラ マジックが進行しているようです。
誰かがここで実際に何が起こっているのかを明確にすることができますか?
編集:私が欠けstatic auto bound = std::bind(fn2, std::ref(a), std::ref(b));
ていたのは、4番目のオプションとして機能させるために使用していました。
c++ - std::vector c++ から std::function を呼び出すとクラッシュする
これを行うと、このエラーが発生します
実行時チェックの失敗 #0 - ESP の値が関数呼び出しで適切に保存されませんでした。これは通常、ある呼び出し規約で宣言された関数を、別の呼び出し規約で宣言された関数ポインターで呼び出した結果です。
呼び出すときdutyStack[0]();
。しかし、追加dutyStack.reserve(10);
した場合、またはベクトルに要素が 1 つしかない場合、エラーは発生しません。ベクトルのサイズを変更するときに要素をコピーしているときに何かが起こっていると思われますが、実際にはわかりません。
私はビジュアルスタジオ2008、Windows 7の下にいます。
c++ - std::bind をパラメータ パックのパラメータにできないのはなぜですか?
パラメータパックを使いたいのですが、問題が見つかりました。いくつかのコード:
これはすべてうまくいきます:
しかし、std::function をパラメーター パックに渡したい場合:
アプリケーションはコンパイルされなくなります。
では、パックのパラメータとして関数を使用する問題は何ですか?
ありがとう。
更新: f のコードを次のように変更した場合:
うまく機能しますが、ここでこの関数を実行したくありません。関数を作成して、param のように渡したいのです。
UPDATE2: コード実行例: http://ideone.com/gDjnPq
UPDATE3: コンパイル エラーでコードをクリア: http://ideone.com/50z7IN
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 でのスタック オーバーフローは、流れるものの無限呼び出しによるものです。
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 の完全な実装をどのように実装できますか ?