Шаблон:Interface implementation base body: различия между версиями
Перейти к навигации
Перейти к поиску
Строка 7: | Строка 7: | ||
{{class template paramlist add|interface_disposal_policy|Политика уничтожения экземпляра класса <tt>impl_t</tt>, реализующего интерфейсы. Класс <tt>interface_disposal_policy</tt> может предоставлять (полиморфный) метод <tt>dispose</tt>, реализующий уничтожение объекта, на который указывает параметр метода. Прототип: <source inline lang="cpp">void dispose(impl_t* ptr) const;</source>. Также класс <tt>interface_disposal_policy</tt> может не предоставлять метода <tt>dispose</tt>, тогда уничтожения объекта не производится - например, если объект определен статически или в стеке. Предопределены следующие политики: [[disposal_policy_do_nothing]] и [[disposal_policy_delete]].}} | {{class template paramlist add|interface_disposal_policy|Политика уничтожения экземпляра класса <tt>impl_t</tt>, реализующего интерфейсы. Класс <tt>interface_disposal_policy</tt> может предоставлять (полиморфный) метод <tt>dispose</tt>, реализующий уничтожение объекта, на который указывает параметр метода. Прототип: <source inline lang="cpp">void dispose(impl_t* ptr) const;</source>. Также класс <tt>interface_disposal_policy</tt> может не предоставлять метода <tt>dispose</tt>, тогда уничтожения объекта не производится - например, если объект определен статически или в стеке. Предопределены следующие политики: [[disposal_policy_do_nothing]] и [[disposal_policy_delete]].}} | ||
{{class template paramlist add|interface_ref_ctr_policy|Политика подсчета ссылок на экземпляр <tt>impl_t</tt>. Если требуется подсчет ссылок на реализацию <tt>impl_t</tt>, то класс <tt>interface_ref_ctr_policy</tt> должен предоставлять два метода: <source lang="cpp">std::size_t add_ref();</source><source lang="cpp">std::size_t release();</source>Вызов метода <tt>add_ref</tt> должен иметь эффект увеличения счетчика ссылок на 1 и возвращать результирующее значение счетчика ссылок. Аналогично, вызов метода <tt>release</tt> должен иметь эффект декремента счетчика ссылок и возвращать результирующее значение счетчика ссылок. Метод <tt>release</tt> не должен уничтожать объект. Если хотя бы один из этих двух методов не определен, подсчет ссылок не производится. Предопределенные политики: [[ref_ctr_policy_none]], [[ref_ctr_policy_st]] и [[ref_ctr_policy_mt]].}} | {{class template paramlist add|interface_ref_ctr_policy|Политика подсчета ссылок на экземпляр <tt>impl_t</tt>. Если требуется подсчет ссылок на реализацию <tt>impl_t</tt>, то класс <tt>interface_ref_ctr_policy</tt> должен предоставлять два метода: <source lang="cpp">std::size_t add_ref();</source><source lang="cpp">std::size_t release();</source>Вызов метода <tt>add_ref</tt> должен иметь эффект увеличения счетчика ссылок на 1 и возвращать результирующее значение счетчика ссылок. Аналогично, вызов метода <tt>release</tt> должен иметь эффект декремента счетчика ссылок и возвращать результирующее значение счетчика ссылок. Метод <tt>release</tt> не должен уничтожать объект. Если хотя бы один из этих двух методов не определен, подсчет ссылок не производится. Предопределенные политики: [[ref_ctr_policy_none]], [[ref_ctr_policy_st]] и [[ref_ctr_policy_mt]].}} | ||
{{class template paramlist add|interface_conversion_policy|Политика преобразования указателя на экземпляр <tt>impl_t</tt> к указателю на заданный интерфейс на основе идентификатора. Тип идентификатора задается вложенным типом политики <tt>interface_conversion_policy::interface_identifier_type</tt>, который должен быть {{cpp_concept|EqualityComparable}}. Также класс политики должен предоставлять метод <tt>convert</tt> так, что если <tt>ID</tt> - идентификатор типа <tt>interface_conversion_policy::interface_identifier_type</tt> интерфейса, к которому необходимо преобразовать указатель <tt>impl</tt> на реализацию типа <tt>impl_t</tt> с помощью политики <source lang="cpp" inline>const interface_conversion_policy policy;</source>, то вызов <source lang="cpp" inline>void* p = policy.convert(ID, &impl);</source> должен присваивать указателю <tt>p</tt> адрес реализации <tt>impl</tt> в соответствии с интерфейсом, который идентифицируется параметром <tt>ID</tt>. Если тип <tt>interface_conversion_policy::interface_identifier_type</tt> и/или метод <tt>convert</tt>, вызываемый над политикой преоразования с доступом только на чтение, классом <tt>interface_conversion_policy</tt> не предоставлены, то класс [[interface_implementation_base]] не предоставляет методов, осуществляющих преобразование ([[interface_implementation_base::convert]], [[interface_implementation_base::IsInterfaceAvailable]], [[interface_implementation_base::RepresentAs]]).}} | {{class template paramlist add|interface_conversion_policy|Политика преобразования указателя на экземпляр <tt>impl_t</tt> к указателю на заданный интерфейс на основе идентификатора. Тип идентификатора задается вложенным типом политики <tt>interface_conversion_policy::interface_identifier_type</tt>, который должен быть {{cpp_concept|EqualityComparable}}. Также класс политики должен предоставлять метод <tt>convert</tt> так, что если <tt>ID</tt> - идентификатор типа <tt>interface_conversion_policy::interface_identifier_type</tt> интерфейса, к которому необходимо преобразовать указатель <tt>impl</tt> на реализацию типа <tt>impl_t</tt> с помощью политики <source lang="cpp" inline>const interface_conversion_policy policy;</source>, то вызов <source lang="cpp" inline>void* p = policy.convert(ID, &impl);</source> должен присваивать указателю <tt>p</tt> адрес реализации <tt>impl</tt> в соответствии с интерфейсом, который идентифицируется параметром <tt>ID</tt>. Если тип <tt>interface_conversion_policy::interface_identifier_type</tt> и/или метод <tt>convert</tt>, вызываемый над политикой преоразования с доступом только на чтение, классом <tt>interface_conversion_policy</tt> не предоставлены, то класс [[interface_implementation_base]] не предоставляет методов, осуществляющих преобразование ([[interface_implementation_base::convert]], [[interface_implementation_base::IsInterfaceAvailable]], [[interface_implementation_base::RepresentAs]]). Предопределенные политики: [[conversion_policy_none]] и [[conversion_policy_map]].}} | ||
{{class template paramlist end}} | {{class template paramlist end}} | ||
{{method_list_title|access=public}} | {{method_list_title|access=public}} |
Версия 17:12, 7 декабря 2017
template <class impl_t, class interface_disposal_policy, class interface_ref_ctr_policy, class interface_conversion_policy, class ... Interfaces>
struct interface_implementation_base;
impl_t | Потомок класса interface_implementation_base, являющийся конечной реализацией всех интерфейсов Interfaces.... |
interface_disposal_policy | Политика уничтожения экземпляра класса impl_t, реализующего интерфейсы. Класс interface_disposal_policy может предоставлять (полиморфный) метод dispose, реализующий уничтожение объекта, на который указывает параметр метода. Прототип: void dispose(impl_t* ptr) const; . Также класс interface_disposal_policy может не предоставлять метода dispose, тогда уничтожения объекта не производится - например, если объект определен статически или в стеке. Предопределены следующие политики: disposal_policy_do_nothing и disposal_policy_delete. |
interface_ref_ctr_policy | Политика подсчета ссылок на экземпляр impl_t. Если требуется подсчет ссылок на реализацию impl_t, то класс interface_ref_ctr_policy должен предоставлять два метода: std::size_t add_ref();
std::size_t release();
|
interface_conversion_policy | Политика преобразования указателя на экземпляр impl_t к указателю на заданный интерфейс на основе идентификатора. Тип идентификатора задается вложенным типом политики interface_conversion_policy::interface_identifier_type, который должен быть EqualityComparable. Также класс политики должен предоставлять метод convert так, что если ID - идентификатор типа interface_conversion_policy::interface_identifier_type интерфейса, к которому необходимо преобразовать указатель impl на реализацию типа impl_t с помощью политики const interface_conversion_policy policy; , то вызов void* p = policy.convert(ID, &impl); должен присваивать указателю p адрес реализации impl в соответствии с интерфейсом, который идентифицируется параметром ID. Если тип interface_conversion_policy::interface_identifier_type и/или метод convert, вызываемый над политикой преоразования с доступом только на чтение, классом interface_conversion_policy не предоставлены, то класс interface_implementation_base не предоставляет методов, осуществляющих преобразование (interface_implementation_base::convert, interface_implementation_base::IsInterfaceAvailable, interface_implementation_base::RepresentAs). Предопределенные политики: conversion_policy_none и conversion_policy_map. |
Открытые методы
Метод | Описание |
---|---|
(конструкторы) | Конструкторы класса interface_implementation_base. |
(деструктор) | Виртуальный деструктор класса interface_implementation_base. |
Release | Метод реализующий закрытие одного экземпляра объекта, реализующего интерфейсы специализации interface_implementation_base. |
AddRef | Условно определенный метод, вызов которого имеет эффект инкремента счетчика ссылок на объект класса interface_implementation_base. |
IsInterfaceAvailable | Условно определенный метод, который проверяет доступность интерфейса по его идентификатору. |
RepresentAs | Условно определенный метод, который осуществляет преобразование в интерфейс, заданный идентификатором. |
Защищенные методы
Метод | Описание |
---|---|
dispose | Метод, реализующий уничтожения объекта interface_implementation_base в соответствии с его политикой interface_disposal_policy. |
add_ref | Метод, реализующий инкремент счетчика ссылок на объект interface_implementation_base. |
release | Метод, реализующий декремент счетчика ссылок на объект interface_implementation_base и, если в результате счетчик становится нулевым, уничтожает объект interface_implementation_base. |
convert | Условно определенный метод, который возвращает указатель на реализацию объекта interface_implementation_base как на программный интерфейс, заданный идентификатором интерфейса. |
Реализует
Интерфейс | Описание |
---|---|
Interfaces...
|