Шаблон:Interface implementation base body

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
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();
Вызов метода add_ref должен иметь эффект увеличения счетчика ссылок на 1 и возвращать результирующее значение счетчика ссылок. Аналогично, вызов метода release должен иметь эффект декремента счетчика ссылок и возвращать результирующее значение счетчика ссылок. Метод release не должен уничтожать объект. Если хотя бы один из этих двух методов не определен, подсчет ссылок не производится. Предопределенные политики: ref_ctr_policy_none, ref_ctr_policy_st и ref_ctr_policy_mt.
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 или nullptr, если интерфейс, заданный идентификатором, не поддерживается. Если тип 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.
Interfaces...Интерфейсы, которые реализуются классом impl_t через класс interface_implementation_base путем их наследования последним.
Открытые методы
МетодОписание
(конструкторы)Конструкторы класса 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...
Заданные шаблонными параметрами интерфейсы.