問題タブ [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.
c++ - メンバー関数を渡して呼び出す (boost::bind / boost::function?)
おそらく恥ずかしいほど単純な問題があります。クラスでメンバー関数を渡し、呼び出します。BOOST バインド (およびまたは関数) を使用したいのはわかっていますが、その概念はまだよく理解していません。
次のコードは、問題を抱えてコンパイルおよび実行されます。しかし、「f3」関数を非静的クラス関数に変更したい場合は、楽しみが始まります。
さて、変更後
に
コンパイラは満足せず、「エラー: 'Test::f2()' の呼び出しに一致する関数がありません」と通知します。
boost::bind および boost::function に関する多くの SO 投稿を読んだ後、f2() の定義と、f1() が f2() を呼び出して、f3() を呼び出すターゲットとして指定する方法を変更する必要があると思いますが、それとは別に...私が試したboost::bindとboost関数のすべての組み合わせは、惨めにコンパイルに失敗しました。
これをどのように書く必要がありますか?おまけの質問として、boost::bind と boost::function に関する簡単な入門書はありますか? BOOST のドキュメントはあまり役に立ちませんでした。
B.
boost - データ メンバー コールバック動作へのブースト バインド
誰かがこのコードを説明してもらえますか?
なぜbar
コンパイルの定義が行われ、その結果は何ですか?
編集:foo()
期待どおりに動作し、 を呼び出しますc.member()
が、bar()
動作しません。
c++ - Objective-C++ブロックでboost::functionを使用できないのはなぜですか?
次のコードは例外をスローします
行でf()
(ブロックの実行中):
一般に、ブロック内でC++オブジェクトを使用できます。メンバー関数内では、メンバー変数および関数への参照は、暗黙的にインポートされたこのポインターを介して行われるため、変更可能に見えます。ブロックがコピーされる場合に適用される2つの考慮事項があります。
スタックベースのC++オブジェクトの__blockストレージクラスがある場合は、通常のコピーコンストラクターが使用されます。
ブロック内から他のC++スタックベースのオブジェクトを使用する場合は、constcopyコンストラクターが必要です。次に、そのコンストラクターを使用してC++オブジェクトがコピーされます。
これは通常は正しいようです。f
上記を、を含む単純なクラスのインスタンスに置き換えるとoperator()()
、上記のコードは期待どおりに実行されます。
なぜバージョンが機能しないのboost::function
ですか?
c++ - boost::bind への生ポインタ引数を削除する
A*
に引数として渡したいヒープが割り当てられているとしましょうboost::bind
。
boost::bind
のコンテナーのような STL で後で処理するために保存されboost::functions
ます。
A*
STLコンテナの破棄時に確実に破棄されるようにしたい。
説明するには:
どうすればそれができますか?
編集
多分私が望んでいることはそれほど現実的ではありません。
私は生のポインタと生のポインタを受け取る関数を持っています。呼び出しはboost::bindによって遅延されます。この時点で、boost::bind を実行したい場合に備えて、自動メモリ管理が必要です。私は怠け者なので、「準備完了」のスマート ポインター ソリューションを使用したいと考えています。
std::auto_ptrは良い候補のように見えますが...
コンパイルされません (こちらを参照)
pAutoA が破棄され、基になる pA が削除されます。
編集 02
上記のコンテナーでは、さまざまな引数を使用してさまざまな「コールバック」を保存する必要があります。それらのいくつかは、オブジェクトへの生のポインターです。コードが古いので、いつでも変更できるとは限りません。
コールバックをコンテナーに格納するための独自のラッパーを作成することは最後の手段です (おそらく唯一の手段ですが)。
c++ - boost::factory作成boost::enable_shared_from_thisクラス
Aから派生した複数のクラスがあります
[...]
boost :: factoryを使用してファクトリパターンを作成したいと思います。私はそのようなものを書きました:
そしてもちろん、それはコンパイルされません...私にエラーを与えます:
任意のアイデア、どのように実装すればよいですか?
c++ - クラス内部ラムダとブースト関数
C++0x のラムダを使用してブースト関数を定義しています。ラムダ/ブースト関数を使用して動作の一部を定義するクラスがいくつかあります。私が疑問に思っていたのは、関数定義を変更せずに、クラスに関するデータをラムダのコンテキストに公開することは可能ですか? たとえば、次のようなクラスのセットがあります。
そして、統計ブーストアイテムのコンストラクター内で、これを実行できるようにしたいと思います:
これは単なる好奇心です。boost::function 定義を単純に拡張して、問題の項目へのポインターを含め、その方法でデータを取得したり、Use 関数をオーバーライドしたりできることを知っているからです。しかし、それを含むクラスに関する情報を何らかの方法でラムダに公開できれば、それを他の場所でも利用できるので理想的です
c++ - typedef 関数ポインターを使用した不完全な型
データ シンクへのインターフェイスを定義する抽象基本クラスがあります。データ シンクの具体的な実装は、ファクトリを介して取得されます。コードを整理するために、DataSink 抽象基本クラス内から新しい DataSink オブジェクトを返すファクトリ メソッドの typedef を作成しました。
boost::function<get_new_data_sink_function_type> getNewDataSinkFunction_;
その後、どこかで a: を宣言しようとすると、次のようになります。
error: field 'getNewDataSinkFunction_' has incomplete type
代わりに宣言すると:
boost::function<std::auto_ptr<DataSink>(std::string)> getNewDataSinkFunction_;
...すべて問題ありません。
DataSink は抽象的であるため不完全な型であることに気付きましたが、std::auto_ptr による参照セマンティクスを使用しているため、それで問題ないはずですよね? いずれにせよ、typedef が失敗し、typedef の定義のカット アンド ペーストが成功する理由は説明できません。これは boost::function の癖ですか?
コンパイラは gcc 4.3.3 です。どんな洞察も大歓迎です。
c++ - tr1::関数は戻り値を飲み込むことができますか?
boost::function FAQ 項目 3は、私が興味を持っているシナリオに具体的に対応しています。
void リターンの回避策があるのはなぜですか? C++ はそれらを許可します! 次のコード スニペットのように、C++ 標準では void リターンが許可されています。
void リターンが使用されないため、これは boost::function の有効な使用法です。void を返すと、次のような形式の悪いコードをコンパイルしようとします。
本質的に、void リターンを使用しないと、boost::function が戻り値を飲み込むことができます。これは、正確に一致しないパラメータを持つ関数と関数オブジェクトをユーザーが割り当てて呼び出すことを許可することと一致しています。
残念ながら、これは VS2008 では機能しません:
これにより、次のエラーが発生します。
これは VS2008 TR1 実装の失敗ですか? これはVS2010で動作しますか? TR1 はこの機能に対応していますか? C++0x はどうですか?