Есть ли в бусте общий класс "очистки"? - PullRequest
2 голосов
/ 06 декабря 2010

Я просто хочу класс, который делает это:

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 );

Здесь функция должна принимать параметр. Я не уверен на 100% даже в том, что средство удаления всегда будет вызываться, если указатель равен NULL, поэтому, возможно, мне нужно использовать другой указатель, чтобы он начал выглядеть «грязно».

Существует ли стандартный способ справиться с этим, а если нет, то какой способ лучше?

1 Ответ

2 голосов
/ 06 декабря 2010

Я считаю, что в Boost есть библиотека Scope Exit. Однако почему бы просто не использовать код, который вы написали в OP? И, как правило, если у вас есть класс в контейнере, заставьте владельца контейнера выделять ссылки и обрабатывать то, что происходит, когда их не осталось.

...