Represent as: различия между версиями
Перейти к навигации
Перейти к поиску
Строка 1: | Строка 1: | ||
{{DISPLAYTITLE:represent_as}} | {{DISPLAYTITLE:represent_as}} | ||
{{function_begin |template <class | {{function_begin |template <class TargetType, class SourceType> | ||
auto represent_as( | auto represent_as(SourceType ref) -> /*См. описание.*/;|{{represent_as brief}}}} | ||
{{function template paramlist begin}} | {{function template paramlist begin}} | ||
{{function template paramlist add| | {{function template paramlist add|TargetType|Задает тип интерфейса, в который должно быть осуществлено преобразование, либо тип [[владеющий адаптер|адаптера с владением]] над таким интерфейсом. Для интерфейса, в который осуществляется преобразование должна быть определена специализация шаблона [[interface_id]].}} | ||
{{function template paramlist add| | {{function template paramlist add|SourceType|Тип указателя на интерфейс, над которым осуществляется преобразование, либо тип {{cpp_language|value_category|xvalue}}-ссылки на [[ссылочный адаптер]] над таким интерфейсом либо {{cpp_language|value_category|glvalue}}-ссылка на смарт-указатель [[unique_interface_ptr]] на такой интерфейс. Интерфейс, из которого осуществляется преобразование, должен поддерживать метод <tt>RepresentAs</tt>, принимающий на вход идентификатор интерфейса, соответствующего <tt>TargetType</tt>, а также указатель типа <source lang="cpp" inline>void**</source>, и возвращаеть код [[return_code_t]], при успешности которого в выходной указатель должен записываться адрес реализации интерфейса, соответствующего <tt>TargetType</tt>, и <source lang="cpp" inline>nullptr</source> - при ошибочности. Тип <tt>SourceType</tt> вычисляется дедукцией параметра <tt>ref</tt>.}} | ||
{{function template paramlist end}} | {{function template paramlist end}} | ||
{{function paramlist begin}} | {{function paramlist begin}} | ||
{{function paramlist add|ref|(Константный) указатель на интерфейс, для которого <source lang="cpp" inline>is_interface<std::remove_pointer_t< | {{function paramlist add|ref|(Константный) указатель на интерфейс, для которого <source lang="cpp" inline>is_interface<std::remove_pointer_t<SourceType>>::value == true</source>, и который поддерживает метод <tt>RepresentAs</tt>, как указано выше, либо (константная) ссылка на [[unique_interface_ptr]] над таким интерфейсом (возможно, с квалификатором {{cpp_const}}), либо универсальная ссылка на [[ссылочный адаптер]].}} | ||
{{function paramlist end}} | {{function paramlist end}} | ||
{{function_return_value|Если <tt>ref</tt> - указатель на [[программный интерфейс]] или ссылка на [[unique_interface_ptr]] над таким интерфейсом, то возвращается [[unique_interface_ptr]] над типом <tt> | {{function_return_value|Если <tt>ref</tt> - указатель на [[программный интерфейс]] или ссылка на [[unique_interface_ptr]] над таким интерфейсом, то возвращается [[unique_interface_ptr]] над типом <tt>TargetType</tt>, в который осуществляется преобразование. Если <tt>ref</tt> - ссылка на [[адаптер программного интерфейса]], то возвращается [[владеющий адаптер]], определенный над целевым интерфейсом.}} | ||
{{function exceptionlist begin}} | {{function exceptionlist begin}} | ||
{{function exceptionlist add|[https://www.chusov.org/doxygen/struct_chusov_1_1_exceptions_1_1_chsv_code_exception_templ.html Chusov::Exceptions::ChsvCodeException]|Исключение, соответствующее коду ошибочного завершения, функции <tt>RepresentAs</tt> интерфейса <tt> | {{function exceptionlist add|[https://www.chusov.org/doxygen/struct_chusov_1_1_exceptions_1_1_chsv_code_exception_templ.html Chusov::Exceptions::ChsvCodeException]|Исключение, соответствующее коду ошибочного завершения, функции <tt>RepresentAs</tt> интерфейса <tt>SourceType</tt>.}} | ||
{{function exceptionlist end}} | {{function exceptionlist end}} | ||
{{function_end}} | {{function_end}} | ||
Шаблон функции [[represent_as]] определен, только если требования, указанные для типов <tt> | Шаблон функции [[represent_as]] определен, только если требования, указанные для типов <tt>TargetType</tt> и <tt>SourceType</tt> удовлетворены. | ||
{{example_begin}} | {{example_begin}} | ||
<source lang="cpp"> | <source lang="cpp"> |
Текущая версия на 21:07, 15 августа 2019
template <class TargetType, class SourceType>
auto represent_as(SourceType ref) -> /*См. описание.*/;
Осуществляет преобразование интерфейса, поддерживающего метод RepresentAs, в другой интерфейс и возвращает unique_interface_ptr-указатель на него или его адаптер с владением.
- Параметры шаблона
TargetType Задает тип интерфейса, в который должно быть осуществлено преобразование, либо тип адаптера с владением над таким интерфейсом. Для интерфейса, в который осуществляется преобразование должна быть определена специализация шаблона interface_id. SourceType Тип указателя на интерфейс, над которым осуществляется преобразование, либо тип xvalue-ссылки на ссылочный адаптер над таким интерфейсом либо glvalue-ссылка на смарт-указатель unique_interface_ptr на такой интерфейс. Интерфейс, из которого осуществляется преобразование, должен поддерживать метод RepresentAs, принимающий на вход идентификатор интерфейса, соответствующего TargetType, а также указатель типа void**
, и возвращаеть код return_code_t, при успешности которого в выходной указатель должен записываться адрес реализации интерфейса, соответствующего TargetType, иnullptr
- при ошибочности. Тип SourceType вычисляется дедукцией параметра ref.- Параметры
ref (Константный) указатель на интерфейс, для которого is_interface<std::remove_pointer_t<SourceType>>::value == true
, и который поддерживает метод RepresentAs, как указано выше, либо (константная) ссылка на unique_interface_ptr над таким интерфейсом (возможно, с квалификатором const), либо универсальная ссылка на ссылочный адаптер.- Возвращаемое значение:
- Если ref - указатель на программный интерфейс или ссылка на unique_interface_ptr над таким интерфейсом, то возвращается unique_interface_ptr над типом TargetType, в который осуществляется преобразование. Если ref - ссылка на адаптер программного интерфейса, то возвращается владеющий адаптер, определенный над целевым интерфейсом.
- Возможные исключения
Chusov::Exceptions::ChsvCodeException Исключение, соответствующее коду ошибочного завершения, функции RepresentAs интерфейса SourceType.
Шаблон функции represent_as определен, только если требования, указанные для типов TargetType и SourceType удовлетворены.
Пример
ConsequentDataStorageInputOwn ibs = represent_as<InputByteStreamOwn>(represent_as<ConsequentDataStorageInputOwn>(storage).read());
unique_interface_ptr<IConsequentDataStorageInput> *ppDataStorage = represent_as<IConsequentDataStorageInput>(m_domain.get_domain_data(element_name_type(pDomainName, cbDomainName)));