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

Composition or inheritance

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

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

class Base
{
   BOOST_COPYABLE_AND_MOVABLE(Base)
   public:
   Base(){}
   Base(const Base &/*x*/) {/**/}            // Copy ctor
   Base(BOOST_RV_REF(Base) /*x*/) {/**/}     // Move ctor
   Base& operator=(BOOST_RV_REF(Base) /*x*/)
   {/**/ return *this;}                      // Move assign
   Base& operator=(BOOST_COPY_ASSIGN_REF(Base) /*x*/)
   {/**/ return *this;}                      // Copy assign
   virtual Base *clone() const
   {  return new Base(*this);  }
   virtual ~Base(){}
};
class Member
{
   BOOST_COPYABLE_AND_MOVABLE(Member)
   public:
   Member(){}
   // Compiler-generated copy constructor...
   Member(BOOST_RV_REF(Member))  {/**/}      // Move ctor
   Member &operator=(BOOST_RV_REF(Member))   // Move assign
   {/**/ return *this;  }
   Member &operator=(BOOST_COPY_ASSIGN_REF(Member))   // Copy assign
   {/**/ return *this;  }
};
class Derived : public Base
{
   BOOST_COPYABLE_AND_MOVABLE(Derived)
   Member mem_;
   public:
   Derived(){}
   // Compiler-generated copy constructor...
   Derived(BOOST_RV_REF(Derived) x)             // Move ctor
      : Base(BOOST_MOVE_BASE(Base, x)),
        mem_(boost::move(x.mem_)) { }
   Derived& operator=(BOOST_RV_REF(Derived) x)  // Move assign
   {
      Base::operator=(BOOST_MOVE_BASE(Base, x));
      mem_ = boost::move(x.mem_);
      return *this;
   }
   Derived& operator=(BOOST_COPY_ASSIGN_REF(Derived) x)  // Copy assign
   {
      Base::operator=(x);
      mem_  = x.mem_;
      return *this;
   }
   // ...
};

[Important]Important

Из-за ограничений в коде эмуляции необходимо отлить Base & перед перемещением базовой части в конструкторе хода и вызвать конструктор хода Base вместо конструктора копии.

Каждый подобъект теперь будет рассматриваться индивидуально, вызывая движение, чтобы привязать к движению подобъекта конструкторов и операторов назначения перемещения. У участника закодированы операции перемещения (как и в нашем предыдущем примере clone_ptr), что позволит полностью избежать гораздо более дорогих операций копирования:

Derived d;
Derived d2(boost::move(d));
d2 = boost::move(d);

Обратите внимание, что аргумент x рассматривается как ссылка на значение l. Вот почему необходимо сказать move(x) вместо просто x при переходе к базовому классу. Это ключевая функция безопасности семантики движения, предназначенная для предотвращения случайного перемещения дважды из некоторой названной переменной. Все движения от lvalues происходят явно.


PrevUpHomeNext

Статья Composition or inheritance раздела 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:47:53/0.0085649490356445/1