Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Movable but Non-Copyable Types

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 23. Boost.Move

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Некоторые типы не поддаются копированию семантики, но все же могут быть сделаны подвижными. Например:

  • <unique_ptr>(нераздельное, некопируемое право собственности)
  • Тип, представляющий нить исполнения
  • Тип, представляющий дескриптор файла

Делая такие типы подвижными (хотя все еще не копируемыми), их полезность значительно увеличивается. Подвижные, но некопируемые типы могут быть возвращены по стоимости из заводских функций:

file_descriptor create_file(/* ... */);
//...
file_descriptor data_file;
//...
data_file = create_file(/* ... */);  // No copies!

В приведенном выше примере, лежащая в основе ручка файла передается от объекта к объекту, если источник<file_descriptor>является значением r. Во все времена существует только одна базовая ручка файла, и только один<file_descriptor>владеет ею одновременно.

Чтобы написать подвижный, но не копируемый тип в портативном синтаксисе, необходимо выполнить следующие простые действия:

Вот определение<filedescriptor>с использованием портативного синтаксиса:

#include <boost/move/utility_core.hpp>
#include <stdexcept>
class file_descriptor
{
   int os_descr_;
   private:
   BOOST_MOVABLE_BUT_NOT_COPYABLE(file_descriptor)
   public:
   explicit file_descriptor(const char *filename)              //Constructor
      : os_descr_(operating_system_open_file(filename))
   {  if(!os_descr_) throw std::runtime_error("file not found");  }
   ~file_descriptor()                                          //Destructor
   {  if(os_descr_)  operating_system_close_file(os_descr_);  }
   file_descriptor(BOOST_RV_REF(file_descriptor) x)            // Move ctor
      :  os_descr_(x.os_descr_)
   {  x.os_descr_ = 0;  }
   file_descriptor& operator=(BOOST_RV_REF(file_descriptor) x) // Move assign
   {
      if(os_descr_) operating_system_close_file(os_descr_);
      os_descr_   = x.os_descr_;
      x.os_descr_ = 0;
      return *this;
   }
   bool empty() const   {  return os_descr_ == 0;  }
};


PrevUpHomeNext

Статья Movable but Non-Copyable Types раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 23. Boost.Move может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 23. Boost.Move ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:26:20/0.0082850456237793/1