問題タブ [boost-bind]
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++ - boost::bind を使用したセマンティクスのような「インターフェース」
Java のインターフェイス セマンティクスのようなものを C++ で使用できるようにしたかったのです。最初はboost::signal
、特定のイベントに対して明示的に登録されたメンバー関数をコールバックしていました。これは本当にうまくいきました。
しかし、関数コールバックのいくつかのプールが関連していると判断し、それらを抽象化し、インスタンスの関連するすべてのコールバックを一度に登録することにしました。しかし、私が学んだことは、の特定の性質boost::bind
および/または値を取ることが、this
そのブレークを作るように見えるということでした. あるいは、メソッド宣言によって生成さadd_listener(X &x)
れるコードが変更されたという事実だけだったのかもしれません。boost::bind
問題が発生した理由は非常に大まかに理解しており、おそらく設計どおりに正しく機能していると思います。私は興味があります:代わりに何をすべきでしたか? 確かにそれを行う正しい方法があります。
コード例を次に示します。
さて、私は問題を完全に説明しませんでした。タイトルは誤解を招くものです。
ちょっと、あなた。これに反対票を投じてください。私は明らかに問題を十分に説明しておらず、最終的にはほとんどが構文エラーに帰着すると思います。:(
c++ - 構造体の配列から構造体メンバーを抽出します
複数の変数を含む構造体の配列があります。
sのベクトルを抽出して、output
を介して別の配列と比較できるようにしBOOST_CHECK_EQUAL_COLLECTIONS
ます。
私はこれを思いついた:
しかし、タイプごとにファンクター/構造体がなくてもこれを実行できるはずです。
構造体から1つの変数のベクトル/配列を抽出するより速い方法はありますか?boost :: lambdaを使用してみましたが、機能しませんでした:
どうやらoperator.()
ラムダ変数では使用できません...何を使用すればよいですか?boost :: bind?
c++ - boost::bindはポインタ引数では機能しません
私はこの簡単なプログラムを持っています。ここでは、メンバー関数をオブジェクトにバインドし、後でメンバー関数の呼び出しに必要な引数を使用して呼び出します。メンバー関数が整数へのポインターを取得すると、gccはコンパイルに失敗します。整数パラメータを使用すると、プログラムがコンパイルされます。これはboost::bindのバグですか、それとも何かが足りませんか?
c++ - ネストされたboost::bindで構成なしで引数置換を実行します
nullaryファンクターを引数として取る関数があるとします。
intを取り、内部で何かを行う別の関数があります。
これらを一緒にネストしますが、作成しないで、署名付きのファンクターを取得します。
値(たとえば4)で呼び出されると、次のように実行されます。
私の最初の試みは次のとおりでした。
ネストされたバインドが与えられると、バインドが合成を実行するため、これは失敗します。fooが最初に呼び出され、次に値voidがエンキューに「返され」ましたが、これは失敗します。
私の2番目の試みは次のとおりです。
enqueueは単項ファンクターではなく、nullaryを受け入れるため、これは失敗しました。
私が求めていることはできますか?
その他の情報:
- これは基本的に、6年前の未回答のブーストフォーラムの質問と同じです:http: //lists.boost.org/boost-users/2004/07/7125.php
- いくつかの読書は、boost :: lambda::bindをboost::lambda::unlambdaおよびboost::lambda::protectと一緒に使用すると私が求めていることを実行できることを示唆しています。残念ながら、boost :: lambdaの許可されるプレースホルダーの数は許容できないほど少なく(3)、コンパイル時のオーバーヘッドが高くなります。
c++ - boost::bind のこの使用法を理解するのを手伝ってください
ペアのベクトルをソートするために Johannes Schaub によって投稿されたこの例を見てください。
ペアの 2 番目の要素に基づいてペアのベクトルを並べ替えるにはどうすればよいですか?
boost::bind は理解できると思っていましたが、これには問題があります。
質問1:
ソート アルゴリズムは、3 番目のパラメーターとして述語関数を想定しています。ここに表示されるのはブール式です。何が欠けていますか?:
boost::bind ライブラリは、これら 2 つのバインドに対して operator< をオーバーロードし、何らかの関数ポインター (ラムダなど) を返していますか?
質問 2:
これは私を混乱させます:
通常、バインド呼び出しの最初のパラメーターとして何らかの関数ポインターがありますが、ここではクラス メンバーのアドレスですか? その特定のバインドの結果は何ですか?
お時間とご協力ありがとうございます
c++ - 関数へのパラメーターとしてのstd::stringstream
私はを持っていて、std::vector<std::string> temp_results
std :: for_eachを使用してこのベクトルを調べ、文字列を連結したいので、次の構造を作成しました。
次のエラーが発生しますが、これは私の理解を超えています。
誰かが何が悪いのか説明してもらえますか?
c++ - while ループで値を連結すると問題が発生する
さまざまなタイプを含むがあり、 type=D,Sboost::variant
のようにする必要がある文字列があります。バリアントの値はそれぞれ D と S で、キーは「type」です。それは私が今その部分を繰り返しているところですmap<std::string, std::vector<variant> >
vector<variant>
ここで、最初に static_visitor をバリアントに適用して適切な変換を行います。この場合は必要ないかもしれませんが、他の型の場合は文字列への変換が必要になります。
ConcatValues
次に、この関数をヘルパー クラスの一部であると呼びます。vector<string> v_accumulator
この関数は while ループで数回呼び出される可能性があり、カンマ区切りの値のリストで終了したいため、 このクラスには一時的な結果を保持する定義があります。
v_accumulator
ただし、問題は、関数呼び出しごとにベクトルが常に空であることです。それがクラス変数であることを考えると、それはどのように意味がありますか。
元のキーと値のペアの値の部分で D、S の値を連結する簡単な方法があるでしょうか?
c++ - 親のスロット内から子オブジェクトを削除するにはどうすればよいですか?おそらくブースト::asio固有
ネットワーククライアントのstd::setを維持するネットワークサーバークラスを作成しました。ネットワーククライアントは、切断時に(boost :: bindを介して)ネットワークサーバーに信号を送信します。ネットワーククライアントが切断された場合、クライアントインスタンスをセットから削除し、最終的に削除する必要があります。これは一般的なパターンだと思いますが、ASIOに固有の問題がある場合とない場合があります。
私は関連するコードだけに切り詰めようとしました:
関数の戻り値が...未定義になるため、スロットハンドラー内からクライアントを削除するのは安全ではないと思います。(興味深いことに、それは私には爆発しないようです。)そこで、私は、boost:shared_ptrとshared_from_thisを使用して、すべてのスロットが通知されるまでクライアントが削除されないようにしました。しかし、それは実際には問題ではないようです。
この質問はASIOに固有のものではないと思いますが、ASIOを使用すると問題が独特の形で現れます。io_service.run()を実行しているスレッドが1つあります。すべてのASIO読み取り/書き込み操作は非同期で実行されます。上記のコードに従ってセットからクライアントオブジェクトを削除しない限り、複数のクライアントが接続/切断してもすべて正常に機能します。クライアントオブジェクトを削除すると、io_serviceは内部でデッドロックしているように見え、別のスレッドを開始しない限り、それ以上の非同期操作は実行されません。io_service.run()呼び出しを試行/キャッチしましたが、エラーを検出できませんでした。
質問:
親スロット内から、シグナルエミッターでもある子オブジェクトを削除するためのベストプラクティスはありますか?
ネットワーククライアントオブジェクトを削除すると、io_serviceがハングする理由について何か考えはありますか?
c++ - boost::bind キャスト引数を必要な型にバインドするのはいつですか?
boost::bind を使用してパラメーターを関数にバインドする場合 - 関数で必要な型にキャストされるのはいつですか (暗黙のキャストが可能な場合)。
それらは bind_t オブジェクトにどのように格納されますか? bind に最初に渡された型として、または関数シグネチャで必要な型として?
具体的には:
サインの機能があれば
そして、バインドを次のように使用します
wheresomePtr
は 型SomeType*
で、bind_t
オブジェクトには単純なポインタとして格納された のコピーが含まれsomePtr
ますか、それとも にキャストされてSmartPointer<SomeType>
として格納されSmartPointer<SomeType>
ますか?
SomeType*
からへの暗黙のキャストがありSmartPointer<SomeType>
ます。boost::shared_ptr
これとは対照的にSmartPointer
、管理対象オブジェクトで参照カウンターを使用するため、意味SomeType
は から派生する必要がありSmartPointed
ます。
c++ - shared_ptrを呼び出す方法ループ内のベクトルから?
boost::signalを使用するコールバックシステムが機能しています。シグナルにshared_ptrのベクトルを使用する、より柔軟で効率的なコールバックマネージャーに拡張しています。コールバックを正常に作成してリストに追加することはできましたが、シグナルを実際に実行する方法がわかりません。
このコードはすべて機能します。ベクターを使用して、shared_ptr内から呼び出しを実行する方法がわかりません。どんな助けでもきちんとしています。前もって感謝します。