2

私は単にこれを行うクラスが欲しい:

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

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

目的は、削除されたときに func を呼び出すために、この「クリーンアップ」を行うことです。cleanup は shared_ptr として渡されます。

また、boost::shared_ptr でカスタムのデリータを使用することも検討しました。おそらく、boost::shared_ptr を使用して、NULL で作成し、func() を取得して、無視するパラメーターを取得できます。

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

shared_ptr でそれを行う場合、次のいずれかを渡す可能性があります。

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

ここで、func はパラメーターを取る必要があります。ポインターが NULL の場合にデリータが常に呼び出されるかどうかも 100% 確信が持てないため、おそらく別のポインターを使用して「乱雑」な外観になるようにする必要があります。

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

4

1 に答える 1

2

Boost 内に Scope Exit ライブラリがあると思います。ただし、OP で記述したコードを使用しないのはなぜですか? そして、通常、コンテナー内にクラスがある場合、コンテナーの所有者に参照をディッシュアウトさせ、何も残っていない場合に何が起こるかを処理します。

于 2010-12-06T12:24:22.687 に答える