StreamOwn::StreamOwn: различия между версиями

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
(Новая страница: «{{function_begin|StreamOwn(); //1 explicit StreamOwn(IStream* pStream) noexcept; //2 StreamOwn(StreamOwn&& right) noexcept; //3 template <class AnotherAdapterRef>…»)
 
Строка 16: Строка 16:
# Конструктор, создающий экземпляр адаптера путем переноса адреса реализации интерфейса <source lang="cpp" inline>AnotherAdapterOwn::interface_type</source> с приведением его к типу <source lang="cpp" inline>IStream*</source>. В результате вызова адаптер {{param|ownRight}} теряет владение своим экземпляром реализации интерфейса <source lang="cpp" inline>AnotherAdapterOwn::interface_type</source> и инициализируется нулевым адресом, как если бы был выполнен вызов <source lang="cpp" inline>ownRight.release_ownership()</source>.}}
# Конструктор, создающий экземпляр адаптера путем переноса адреса реализации интерфейса <source lang="cpp" inline>AnotherAdapterOwn::interface_type</source> с приведением его к типу <source lang="cpp" inline>IStream*</source>. В результате вызова адаптер {{param|ownRight}} теряет владение своим экземпляром реализации интерфейса <source lang="cpp" inline>AnotherAdapterOwn::interface_type</source> и инициализируется нулевым адресом, как если бы был выполнен вызов <source lang="cpp" inline>ownRight.release_ownership()</source>.}}
{{function template paramlist begin}}
{{function template paramlist begin}}
{{function template paramlist add|AnotherAdapterRef|Тип ссылочного адаптера, участвующего в качестве параметра {{param|refRight}} в конструкторе 4. Значение <source lang="cpp" inline>std::is_convertible_v<typename AnotherAdapterRef::interface_type*, const IStream*></source> должно быть {{cpp_true}}, адаптер - [[ссылочный адаптер|ссылочным]], а интерфейс <source lang="cpp" inline>AnotherAdapterRef::interface_type</source> должен поддерживать вызов <source lang="cpp" inline>pI->Clone()</source>, где <tt>pI</tt> - указатель типа <source lang="cpp" inline>AnotherAdapterRef::interface_type*</source>.}}
{{function template paramlist add|AnotherAdapterRef|Тип ссылочного адаптера, участвующего в качестве параметра {{param|refRight}} в конструкторе 4. Значение <source lang="cpp" inline>std::is_convertible_v<typename AnotherAdapterRef::interface_type*, IStream*></source> должно быть {{cpp_true}}, адаптер - [[ссылочный адаптер|ссылочным]], а интерфейс <source lang="cpp" inline>AnotherAdapterRef::interface_type</source> должен поддерживать вызов <source lang="cpp" inline>pI->Clone()</source>, где <tt>pI</tt> - указатель типа <source lang="cpp" inline>AnotherAdapterRef::interface_type*</source>.}}
{{function template paramlist add|AnotherAdapterOwn|Тип адаптера с владением, участвующего в качестве параметра {{param|ownRight}} в конструкторах 5 и 6. Значение <source lang="cpp" inline>std::is_convertible_v<typename AnotherAdapterOwn::interface_type*, const IStream*></source> должно быть {{cpp_true}}, адаптер - [[владеющий адаптер|владеющим]]. Для копирования перегрузкой 5 интерфейс <source lang="cpp" inline>AnotherAdapterOwn::interface_type</source> также должен поддерживать вызов <source lang="cpp" inline>pI->Clone()</source>, где <tt>pI</tt> - указатель типа <source lang="cpp" inline>AnotherAdapterOwn::interface_type*</source>.}}
{{function template paramlist add|AnotherAdapterOwn|Тип адаптера с владением, участвующего в качестве параметра {{param|ownRight}} в конструкторах 5 и 6. Значение <source lang="cpp" inline>std::is_convertible_v<typename AnotherAdapterOwn::interface_type*, IStream*></source> должно быть {{cpp_true}}, адаптер - [[владеющий адаптер|владеющим]]. Для копирования перегрузкой 5 интерфейс <source lang="cpp" inline>AnotherAdapterOwn::interface_type</source> также должен поддерживать вызов <source lang="cpp" inline>pI->Clone()</source>, где <tt>pI</tt> - указатель типа <source lang="cpp" inline>AnotherAdapterOwn::interface_type*</source>.}}
{{function template paramlist end}}
{{function template paramlist end}}
{{function_paramlist begin}}
{{function_paramlist begin}}

Версия 19:58, 8 августа 2019

StreamOwn(); //1
explicit StreamOwn(IStream* pStream) noexcept; //2
StreamOwn(StreamOwn&& right) noexcept; //3
template <class AnotherAdapterRef>
explicit StreamOwn(const AnotherAdapterRef& refRight) noexcept; //4
template <class AnotherAdapterOwn>
StreamOwn(const AnotherAdapterOwn& ownRight) noexcept; //5
template <class AnotherAdapterOwn>
StreamOwn(AnotherAdapterOwn&& ownRight) noexcept; //6

Конструкторы адаптера с владением.

  1. Конструктор по умолчанию, инициализирующий создаваемый экземпляр адаптера нулевым адресом.
  2. Явный конструктор, инициализирующий создаваемый экземпляр адаптера адресом реализации потока.
  3. Конструктор, выполняющий инициализацию адаптера с перемещением адаптируемой реализации интерфейса. Адаптер right в результате операции теряет владение реализацией потока, как если бы был выполнен вызов right.release_ownership() с присваиванием возвращенного адреса создаваемому адаптеру.
  4. Явный конструктор, создающий адаптер с адресом реализации интерфейса, полученным из ссылочного адаптера refRight путем вызова refRight.get_interface()->Clone() с неявным приведением результата к типу IStream*. Данный конструктор участвует в разрешении перегрузки, только если подтип AnotherAdapterRef::interface_type существует и поддерживает метод AnotherAdapterRef::interface_type::Clone(), указатель AnotherAdapterRef::interface_type* приводим неявно к типу IStream*, а сам тип AnotherAdapterRef является ссылочным адаптером.
  5. Конструктор, создающий экземпляр адаптера на основе заданного параметром адаптера с владением путем клонирования интерфейса (то есть вызова метода ownRight.get_interface()->Clone()). Данный конструктор участвует в разрешении перегрузки, только если подтип AnotherAdapterOwn::interface_type существует и поддерживает метод AnotherAdapterOwn::interface_type::Clone(), указатель AnotherAdapterOwn::interface_type* приводим неявно к типу IStream*, а сам тип AnotherAdapterOwn является адаптером с владением.
  6. Конструктор, создающий экземпляр адаптера путем переноса адреса реализации интерфейса AnotherAdapterOwn::interface_type с приведением его к типу IStream*. В результате вызова адаптер ownRight теряет владение своим экземпляром реализации интерфейса AnotherAdapterOwn::interface_type и инициализируется нулевым адресом, как если бы был выполнен вызов ownRight.release_ownership().
Параметры шаблона
AnotherAdapterRefТип ссылочного адаптера, участвующего в качестве параметра refRight в конструкторе 4. Значение std::is_convertible_v<typename AnotherAdapterRef::interface_type*, IStream*> должно быть true, адаптер - ссылочным, а интерфейс AnotherAdapterRef::interface_type должен поддерживать вызов pI->Clone(), где pI - указатель типа AnotherAdapterRef::interface_type*.
AnotherAdapterOwnТип адаптера с владением, участвующего в качестве параметра ownRight в конструкторах 5 и 6. Значение std::is_convertible_v<typename AnotherAdapterOwn::interface_type*, IStream*> должно быть true, адаптер - владеющим. Для копирования перегрузкой 5 интерфейс AnotherAdapterOwn::interface_type также должен поддерживать вызов pI->Clone(), где pI - указатель типа AnotherAdapterOwn::interface_type*.
Параметры
[in]pStreamУказатель на адаптируемую реализацию потока IStream.
rightАдаптер, передающий владение своим интерфейсным указателем, если он есть, создаваемому экземпляру StreamOwn, как если бы был выполнен вызов right.release_ownership().
refRightСсылочный адаптер, реализация интерфейса которого клонируется с целью создания копии, управляемой создаваемым адаптером, как если бы был выполнено создание адаптера путем вызова перегрузки 2 с аргументом refRight.get_interface()->Clone().
ownRightВладеющий адаптер, реализация интерфейса которого клонируется или переносится на создаваемый адаптер. Копирование выполняется перегрузкой 5, как если бы был выполнено создание адаптера путем вызова перегрузки 2 с параметром ownRight.get_interface()->Clone(). Перемещение выполняется перегрузкой 6, как если бы был выполнено создание адаптера путем вызова перегрузки 2 с аргументом ownRight.release_ownership().