ATL Copy Policy Classes
служебные классы классов политики копирования, используемого для инициализации, копирования и удаления данных. Классов политики копирования позволяют определить семантику копирования для любого типа данных, и указать преобразования между различными типами данных.
Копирует классы политики использования библиотеки ATL в его реализациях следующих шаблонов:
Путем инкапсуляции сведения, необходимые, чтобы скопировать или преобразовать данные в классе политики копирования, который может быть передан в качестве аргумента шаблона, разработчики библиотеки ATL, предоставленных для особой повторное использование этих классов. Например, если необходимо реализовать коллекцию, используя любой произвольный тип данных, то все необходимо предоставить подходящую политика копии; никогда не касатьться код, который реализует коллекцию.
Определение
По определению, класс, который предоставляет следующие статические функции класс политики копирования:
static void init(DestinationType* p);
static HRESULT copy(DestinationType* pTo, const SourceType* pFrom);
static void destroy(DestinationType* p);
Можно заменить типы DestinationType и SourceType с произвольными типами данных для каждой политики копирования.
Примечание
Хотя можно задать политику копии классифицирует для любых произвольных типов данных, использования классов в коде библиотеки ATL необходимо ограничить типы, которые имеют смысла.Например, при использовании классов политики копирования с реализациями коллекции или перечислителя библиотеки ATL, DestinationType должен иметь тип, который может быть использован в качестве параметра в методе COM-интерфейса.
Используйте INIT для инициализации данных, копирование для копирования данных и destroy для освобождения данные. Явная смысл инициализации, копирование и разрушение домен класса политики копирования и различаются в зависимости от типов данных.
2 Требования при использовании и реализации классов политики копирования:
Первый параметр в копирование должен получить лишь указатель на данные, ранее инициализировали с помощью INIT.
destroy всегда должно получать только указатель на данные, ранее инициализировали с помощью INIT или скопирован с помощью копирование.
Стандартные реализации
Библиотеки ATL предоставляет 2 классов политики копирования в форме классов шаблона _Copy и _CopyInterface:
Класс _Copy позволяет копировать только однотиповый (не преобразование между типами данных), поскольку он содержит только один параметр шаблона для определения и DestinationType и SourceType. Универсальная реализация этого шаблона не содержит код инициализации или удаления и использует memcpy для копирования данных. Библиотеки ATL предоставляет также специализации _Copy для VARIANT, LPOLESTR, типов данных OLEVERB и CONNECTDATA.
Класс _CopyInterface предоставляет реализацию для копирования указатели интерфейса после стандартных правил модели COM. Еще раз этот класс разрешает только однотиповая копирование, поэтому он использует простое назначение и вызов AddRef выполнить копирование.
Пользовательские реализации
Обычно необходимо указать собственных классов политики копирования для разнородной копирования (то есть преобразование между типами данных). В ряде примеров пользовательских классов политики копирования, просмотрите файлы VCUE_Copy.h и VCUE_CopyString.h в образце ATLCollections. Эти файлы содержат 2 классов политики копирования шаблона, GenericCopy и MapCopy, а также несколько специализаций GenericCopy для различных типов данных.
GenericCopy
GenericCopy позволяет указать SourceType и DestinationType как аргументы шаблонов. Вот наиболее общая форма класса GenericCopy из VCUE_Copy.h:
template <class DestinationType, class SourceType = DestinationType>
class GenericCopy
{
public :
typedef DestinationType destination_type;
typedef SourceType source_type;
static void init(destination_type* p)
{
_Copy<destination_type>::init(p);
}
static void destroy(destination_type* p)
{
_Copy<destination_type>::destroy(p);
}
static HRESULT copy(destination_type* pTo, const source_type* pFrom)
{
return _Copy<destination_type>::copy(pTo, const_cast<source_type*>(pFrom));
}
}; // class GenericCopy
VCUE_Copy.h также содержит следующие специализации этого класса: GenericCopy<BSTR>, GenericCopy<VARIANT, BSTR>, GenericCopy<BSTR, VARIANT>. VCUE_CopyString.h содержит специализации для копирования из std::string s: GenericCopy<std::string>, GenericCopy<VARIANT, std::string> и GenericCopy<BSTR, std::string>. Можно повысить за счет GenericCopy дальнейшие специализации.
MapCopy
MapCopy, скопированными предполагается, что данные будут храниться в сопоставлении STL- стиля, поэтому они позволяют задавать тип сопоставления, в котором хранятся данные и целевой тип. Реализация класса просто использует typedef, предоставляемые классом MapType для указания типа данных источника и вызывает соответствующий класс GenericCopy. Нет специализации этого класса не требуются.
template <class MapType, class DestinationType = MapType::referent_type>
class MapCopy
{
public :
typedef DestinationType destination_type;
typedef typename MapType::value_type source_type;
typedef MapType map_type;
typedef typename MapType::referent_type pseudosource_type;
static void init(destination_type* p)
{
GenericCopy<destination_type, pseudosource_type>::init(p);
}
static void destroy(destination_type* p)
{
GenericCopy<destination_type, pseudosource_type>::destroy(p);
}
static HRESULT copy(destination_type* pTo, const source_type* pFrom)
{
return GenericCopy<destination_type, pseudosource_type>::copy(pTo, &(pFrom->second));
}
}; // class MapCopy