2010-12-06 26 views
2

私は単にこれを行うクラスをしたい:ブーストには一般的な「クリーンアップ」クラスがありますか?

class cleanup : boost::noncopyable 
{ 
public: 
    typedef boost::function0<void> function; 
    explicit cleanup(function f) : func(f) 
    { 
    } 

    ~cleanup() 
    { 
    func(); 
    } 
    private: 
    function func; 
}; 

目的は、私はそれが削除されたときにFUNCを呼び出すために、この「クリーンアップ」を持っているということで。クリーンアップはshared_ptrとして渡されます。

私はboost :: shared_ptrのカスタムディテクタを使ってやっていることも考えました。たぶん私はboost :: shared_ptrを使用し、NULLで作成してfunc()を取得して無視するパラメータを取ることができます。

この目的は、最後の参照が範囲外になったときにクラスのデストラクタが実行するステップを抽象化することです(実際には、クラスがコンテナについて知らなくてもそれを保持するコンテナから自分自身を削除します) 。

私はshared_ptrのでそれを行う場合、私はおそらく周りにこれらのいずれかを渡します

ここ
boost::shared_ptr<void> cleanupObj(NULL, func); 

funcがパラメータを取る必要があります。ポインタがNULLの場合、Deleterが常に呼び出されるということは100%確信しているわけではありません。おそらく、別のポインタを使用する必要があります。

これを処理する標準的な方法はありますか?そうでない場合は、何が最善の方法ですか。

+1

正確に何が必要ですか? 'func()'が既存のオブジェクトのデストラクタを使って行うことができないことの例を挙げてください。 –

+0

私はもともと私が望むことをやるためにクラスを作成し、それを抽出して、boost :: functionでラップして私がプライベートなものをプライベートにすることを可能にし、すべてです。 func()を保持するアイテムは、コンテナ内のアイテムであり、そのコンテナに依存してはいけません。アイテムがもはや必要でなくなると、テーブルから削除されます。テーブル自体はweak_ptrを参照として格納します。 – CashCow

+0

あなたの説明からは、それほど良い考えではないかもしれない何かをしようとしているように思えます。たぶんあなたが問題を分かち合うと、より良い答えとそれを解決する良い方法が得られるでしょう。 @Daniel Lidstrom。 –

答えて

2

私はBoost内にScope Exitライブラリがあると思います。しかし、OPで書いたコードを使用するだけではどうですか?そして、通常、コンテナ内にクラスがある場合は、コンテナのオーナーディッシュを参照から外し、何も残っていないときに何が起こるかを処理します。

+0

それはfunc()が行うべきことです。コンテナの所有者は、「残っていないときに何が起こるのかを処理する」ためにそれを作成します。アイテムを容器から取り出す。 – CashCow

+0

私はScope Exitを見ましたが、実際に私が探しているものではありません。クラス/スコープではなく、クラススコープで何か起こっていることを調べています。 Scope Exitは、関数の範囲内で自動的にRAIIオブジェクトを生成します。 – CashCow

+0

「OPで書いたコードを使用する」という部分がベスト・アイデアのようです。エキスパートが一人もいないことを考えれば、それを行うための標準的な向上方法があると私は考えていません。私はこの答えを受け入れています。 – CashCow

関連する問題