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

c++ - テンプレート フレンド関数を使用する場合の未解決のオーバーロードされた関数型

クラステンプレートのフレンド関数をに詰め込もうとしているところに問題がありますboost::function:

の 2 行はどちらもmainコンパイルされません。最初のものについて、GCC は不平を言います:

2行目のエラーは、私にはさらに混乱しているようです:

一致しない理由がわからないので、ちょっと困っていますdouble dot(Vec<2>, Vec<2>)

ここで何が起こっているかについてのアイデアはありますか?

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

c++ - テンプレート署名からboost::functionを作成する方法

最近、私はを隠す柔軟なオブザーバーパターンの実装を作成しようとしていましたboost::signal。私はほとんど成功しました。

テンプレートパラメータによって提供される署名に一致するメソッドを持たなければならないObserverクラスがあります。update

使用例:

オーバーロードされたメソッドobserverがない場合は、すべてが正常に機能します。updateその場合boost::bind、使用する正しい方法を推測することはできません。残念ながら、更新引数がわからないため、明示的なキャストを使用できません(この情報はにありFunctionSignatureます)。

次の方法で問題が発生します。

boost::functionそれがこの問題の解決に役立つと思います。テンプレートの署名のみを使用して、正しいメンバーメソッドでバインドする方法がわかりません。

それも可能ですか?

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

c++ - boost::function をそれほど寛大にしないようにするにはどうすればよいですか?

RegisterCallback への 2 回目の呼び出しをコンパイルしないようにする方法はありますか?

コンテキストについて:
最近、コールバック シグネチャを変更し、bool 引数を追加しました。これを使用しているものはすべて更新したと思っていましたが、間違っていました。RegisterCallback署名を変更するたびに名前を変更する以外に、すべての引数が使用されるようにコンパイラーに強制させる方法が必要です。

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

c++ - 関数と Python を使用した Boost.Bind

コンパイル時にエラーが発生しますが、その理由がわかりません。次のコードはコンパイルを拒否し、次のエラーが発生します。

エラー C2664: 'void (PyObject *,const char *,boost::type *)': パラメーター 1 を 'const char *' から 'PyObject *' に変換できません
エラー C2664: 'void (PyObject *,const char *,boost ::type *)': パラメーター 3 を 'boost::shared_ptr' から 'boost::type *' に変換できません

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

c++ - ブーストバインドクラス関数ポインタ

本質的に作成するfooのインスタンスなしでFoo.f1のs1をバインドできるようにしたい

次に、func1とfunc2をパラメーターとして他の関数に渡します。この関数内で、Fooは最終的にバインドされます。

質問:これは可能ですか?はいの場合、1)それを達成する方法は?2)MyFooFuncの宣言は何ですか?

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

c++ - ブースト::関数オブジェクトの範囲でstd::for_eachを使用する方法は?

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

c++ - DLLからブースト関数へのC++ロード関数

特定の関数を DLL から読み込み、Boost 関数内に格納したいと考えています。これは可能ですか?

ありがとう、ゴクル。

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

c++ - 仮想関数、function_pointer、ファンクターのいずれかを選択する

関数の実装の1つがユーザーに依存するクラスを書いています。現在、私はそれを仮想関数として持っており、ユーザーはその実装を提供するために私のクラスをオーバーライドする必要があります。ユーザーが登録できるように、functor(boost :: function)/function_pointerにすることを考えています。アプリケーションはパフォーマンスが非常に重要であり、見栄えの良いクラスよりも速度が重要です。ファンクターに変更すると、パフォーマンスが向上しますか?

ほとんどの場合、それは無料の関数になるので、関数ポインタは問題ないはずです。しかし、状態が必要になる場合があり、したがってそれはファンクターである必要があると思います。

function_ptrまたはfunctorのいずれかを登録し、ブール値に基づいて適切なものを呼び出すことを許可することで、パフォーマンス上の利点が得られますか?これに似たもの。

アップデート:

私は共有ライブラリを書いていますが、クライアントはそれに対して動的にリンクします。C++0xはありません。:(

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

c++ - boost::bind を使用して、予想よりも多くの引数を安全に渡していますか?

を使用すると、結果のは、バインドされたオブジェクトが期待するよりも多くの引数を受け取る場合があります。概念的に:

この場合、func()署名が引数を取らないことを示していても、スタックで 1、2、および 3 を受け取ります。

boost::bindこれは、 for partial applicationのより一般的な使用法とは異なります。この場合、特定のオブジェクトに対して値が固定され、バインドされたオブジェクトを呼び出すときに、boost::functionより少ない数の引数を取るが、正しい数の引数を提供するが生成されます。

次のコードは、両方の MSVC++2010 SP1 で動作します。これは投稿用の縮小フォームです。元のコードは、Linux の g++4.4 でも動作します。

以下は、C++ 標準に従って適切に定義されていますか?

機能する理由を理解しzeroArg(42)ています。未使用の引数は、呼び出しルーチンによってスタックに置かれ、呼び出されたルーチンによってアクセスされません。呼び出されたルーチンが戻ると、呼び出し元のルーチンはスタックをクリーンアップします。引数をスタックに置くので、それらを削除する方法を知っています。

別のアーキテクチャまたはコンパイラに移動すると、これが壊れますか? より積極的な最適化はこれを破りますか?


Boostのドキュメントまたは標準ドキュメントから、より強力な声明を探しています。どちらにも明確な位置を見つけることができませんでした。

デバッガーを使用してアセンブリとスタックを調べるとfunc、最初の例から値 1、2、および 3 を受け取っていないことが明らかです。その点では正しいです。func02 番目の例でも同じことが言えます。これは、少なくとも私が検討している実装、MSVC++2010SP1 および g++4.4/Linux には当てはまります。

参照されている Boost のドキュメントを見ると、追加の引数を渡しても安全かどうかは、私が望むほど明確ではありません。

最後の例では、 によって生成された関数オブジェクトにはbind(g, _1, _1, _1)、最初の引数以外の引数への参照が含まれていませんが、複数の引数で使用できることに注意してください。3 番目の例で最初と 2 番目の引数が無視されるように、余分な引数は無視されます。 [私のものを強調]

余分な引数が無視されることについての声明は、これが一般的な場合に当てはまることを私に納得させたいほど明確ではありません。TR1を見ると、3.6.3 節から明らかなように、呼び出し可能なオブジェクトの戻り値は、ターゲット オブジェクトが期待するbind数とは異なる数の引数で呼び出すことができます。それは利用可能な最高の保証ですか?

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

c++ - std::vectorを使用するboost::bind付き

に慣れようとしているときに、と一緒boostに使用すると問題が発生しました。私は簡単なことをしようとしています。類似した署名を持つ関数のリストを用意し、サンプルデータでそのすべての関数を使用します。コードは次のとおりです。boost::functionstd::vectorstd::for_each

それで、for_each私は標準出力にすべての関数をサンプルデータに適用した結果を書き込もうとしています。ただし、このようにコンパイルされることはありません(結果の演算子<<が欠落していることに関する長いメッセージbind)。

ストリーム演算子を削除すると、コンパイル可能ですが役に立たないコードになります。秘訣は、関数の適用とテキスト出力を1つで実行したいということですfor_each。私は何が欠けていますか?ラムダやそのようなsmthを使用すると簡単なはずですが、正しい解決策を見つけることはできません。