среда, 21 августа 2013 г.

shared descriptor

shared object
/** Автоматическое закрытие файла с подсчётом ссылок. */

/** Полезно отдавать дескрипторы во владение объектам, которые при
    уничтожении закрывают этот дескриптор (RAII). Чаще это делается
    так: */
struct holder
{
  holder(int fd): m_fd(fd) {}
  ~holder() { ::close(fd); }
private: const int m_fd;
};

/** Минус данного подхода - нет счётчика ссылок. Для объектов типа
    FILE* можно было бы использовать так: */
boost::shared_ptr<FILE> file(fopen(), fclose_check);
/** Вторым аргументом указывается функтор, удаляющий объект, который
    проверяет, что входной аргумент не NULL, иначе SIGSEGV */

/** Но что делать для типов не являющихся указателями? Есть
    решение: */

template <typename T>
struct shared_descriptor: public boost::shared_ptr<T>
{
  template <typename D>
  shared_descriptor(T value, D deleter)
  : boost::shared_ptr<T>(new T(value), boost::bind(deleter, value))
  , m_value(get()) {}
private:
  boost::shared_ptr<T> m_value;
};

/** Пример: */
boost::shared_ptr<int> file1 = shared_descriptor<int>(open("file.txt"), close);
std::cout << "descriptor: " << *file << std::endl;

Комментариев нет:

Отправить комментарий