質問: shared_ptrチェーン/ブランチと2番目のデリゲーター shared_ptrのユーザーがいつ完了したか、つまりユーザーが最終的にすべてのコピーをリリースしたときを知る必要がある状況があります。通常、ここではデリターを使用していますが、この場合は小さなキャッチがあります。基礎となるオブジェクトはすでにshared_ptrです! すなわち、擬似コードでは: ``` shared_ptr a( new T ); . . . shared_ptr b( a, bind( delete_func, id ) ); ``` 私は元のshared_ptrから新しいブランチを作り出しています。この新しいshared_ptr `b` は通常のshared_ptrのようにコピーして使用できますが、この特定の分岐が完了したときにdelete_funcを呼び出す必要があります。今度は、この新しいshared_ptrに基底のオブジェクトも保持する必要があるので(これは最後のshared_ptrかもしれません)、ここで `a.get()`を使用することはできません。 私は大幅にフレームワークを変更することなくこれを行うためのいくつかの方法を探しています。誰かが良いシンプルなソリューションを見ていますか? *スマートポインタとバインド用のブーストライブラリを使用しています。*
回答: 私は可能な解決策を思いついた。 次のようなDeleter関数を作成します: ``` void delete_func( int id, shared_ptr underlying ); ``` 次にshared_ptrをチェーンするには、次のようにします: ``` shared_ptr b( a.get(), bind( &delete_func, id, a ) ); ``` これにより、カスタムのDeleter(myブランチ)を持つ新しい未接続のshared_ptrが作成されます。パラメータの1つが元のshared_ptrであるため、これも基礎となるshared_ptrオブジェクトを維持する必要があります。今私はちょっとこれをテストする必要があります。