Поделиться через


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

См. также

Основные понятия

Implementing an STL-Based Collection

Образец ATLCollections