2

boost::bind を使用してパラメーターを関数にバインドする場合 - 関数で必要な型にキャストされるのはいつですか (暗黙のキャストが可能な場合)。

それらは bind_t オブジェクトにどのように格納されますか? bind に最初に渡された型として、または関数シグネチャで必要な型として?

具体的には:

サインの機能があれば

void SomeFun(SmartPointer<SomeType>)

そして、バインドを次のように使用します

boost::bind(&SomeFun, somePtr)

wheresomePtrは 型SomeType*で、bind_tオブジェクトには単純なポインタとして格納された のコピーが含まれsomePtrますか、それとも にキャストされてSmartPointer<SomeType>として格納されSmartPointer<SomeType>ますか?

SomeType*からへの暗黙のキャストがありSmartPointer<SomeType>ます。boost::shared_ptrこれとは対照的にSmartPointer、管理対象オブジェクトで参照カウンターを使用するため、意味SomeTypeは から派生する必要がありSmartPointedます。

4

2 に答える 2

2

SomeType* から shared_ptr への暗黙的な変換または暗黙的なコンストラクターがないため、これは機能しません。

あなたは電話するべきです

boost::bind(&SomeFun, boost::shared_ptr<SomeType>(somePtr))

somePtr が「new」で割り当てたばかりのポインターであり、shared_ptr の最後の参照が範囲外になったときに後で削除されることを期待します。ポインターを削除したくないが、呼び出し時にポインターが有効であることがわかっていて、関数が shared_ptr を受け取る必要がある場合は、no-op デリータを使用して shared_ptr を作成できます。いずれにせよ、これは shared_ptr であり、ポインターや weak_ptr など、このインスタンスで渡さなければならないものではありません。

あなたのケースは違うと言うので、実際のケースまたはそれに近いケースを確認する必要があります.

渡す関数がクラス メンバー関数であり、クラス インスタンス (オブジェクト) をパラメーターの 1 つとして渡す場合、混乱するかもしれません。ここでは、ポインター、参照、または shared_ptr を渡すことができます。関数が const メソッドの場合は、const 参照にすることができます (同様に、const へのポインターまたは const への shared_ptr)。

これは単純に、関数がクラス メンバー関数である場合、boost::bind にさまざまなオーバーロードがあるためです。

変換が暗黙的である場合、関数が呼び出されたときに暗黙的な変換が行われます。boost::bind は、渡されたものを格納する単なるテンプレートです。メンバー関数を呼び出すために最初のパラメーターを使用すると、いくつかの魔法が発生します。

boost::bind は、関数が実際に参照を取る boost::ref を格納する場合があることに注意してください。

于 2011-01-12T13:10:03.340 に答える
0

渡された型として格納されます。

バインドを実行したときではなく、バインドによって返された関数オブジェクトを呼び出したときに変換が行われます。

shared_ptr コンストラクターが明示的にマークされていない場合:

template<class Y>
explicit shared_ptr( Y * p ): px( p ), pn( p ) // Y must be complete

そうすると、boost::bind のこの動作を考えると、興味深いバグが発生することになります。ファンクターを 1 回だけ呼び出した場合は、すべて問題なく、オブジェクトが削除されます。これを複数回呼び出した場合、2 回目にポインタから shared_ptr を構築したため、すでに解放されているポインタを使用することになるため、二重の解放と解放後の使用のバグが発生していたでしょう。

( boost::bind がこのように実装されている理由について、関連する質問をしたところです)

于 2012-06-29T02:08:21.760 に答える