Sdílet prostřednictvím


ATL kopie zásady tříd

Kopie zásady třídy jsou nástroj třídy slouží k inicializaci, kopírovat a odstranit data.Kopie zásady třídy umožňují definovat sémantiku kopie pro každý typ dat a definování převodů mezi různými typy dat.

ATL použití kopie zásady třídy v jeho implementace následující šablony:

Zapouzdřením informace potřebné k kopírovat nebo převádět data ve třídě kopie zásady, která mohou být předána jako argument šablony ATL vývojáři poskytly pro extrémní opětovné použití těchto tříd.Pokud potřebujete implementovat pomocí libovolného typu kolekce, je třeba poskytnout je například kopii příslušné politiky; Máte nikdy dotknout kód, který implementuje kolekce.

Definice

Podle definice je třída, která poskytuje následující funkce statické třídy kopie zásady:

static void init(DestinationType* p);

static HRESULT copy(DestinationType* pTo, const SourceType* pFrom);

static void destroy(DestinationType* p);

Můžete nahradit typy DestinationType a SourceType s libovolného datové typy pro každou zásadu kopie.

[!POZNÁMKA]

Přestože můžete definovat třídy kopie zásady pro všechny typy dat libovolného, použití třídy v kódu ATL měli omezit typy smysl.Například při použití kopie zásady třídy ATL v kolekci nebo implementace čítače výčtu DestinationType musí být typu, který lze použít jako parametr do metody rozhraní COM.

Použití init Inicializace dat, copy kopírovat data, a zničit uvolnit data.Přesný význam inicializace, kopírování a zničení jsou třídy kopie zásady domény a bude záviset se datové typy.

Existují dva požadavky na používání a provádění zásady třídy kopie:

  • První parametr copy pouze musí obdržet ukazatel na data, která jste dříve inicializován pomocí init.

  • zničit pouze musí obdržet ukazatel na data, která jste dříve inicializován pomocí init nebo zkopírovány prostřednictvím copy.

Standardní implementace

ATL poskytuje dvě třídy kopie zásady ve formě _Copy a _CopyInterface třídy šablon:

  • _Copy třída umožňuje kopírování pouze homogenní (není převod mezi typy dat) od nabízí pouze jednoho parametru zadat obě DestinationType a SourceType.Neobsahuje žádný kód inicializace nebo zničení obecného provádění této šablony a používá memcpy zkopírovat data.ATL poskytuje také specializace z _Copy pro VARIANTY, LPOLESTR , OLEVERB, a CONNECTDATA datové typy.

  • _CopyInterface třída poskytuje implementaci pro kopírování ukazatele rozhraní standardu COM pravidel.Znovu této třídy umožňuje pouze homogenní kopírování, tak jednoduché přiřazení a volání AddRef ke kopírování.

Vlastní implementace

Obvykle musíte definovat své vlastní třídy kopie zásady pro heterogenní kopírování (, konverze mezi typy dat).Některé příklady vlastní kopii zásady tříd, podívejte se na soubory VCUE_Copy.h a VCUE_CopyString.h v ATLCollections vzorku.Tyto soubory obsahují dvě třídy zásad kopie šablony GenericCopy a MapCopy , plus počtu odborností z GenericCopy pro různé datové typy.

GenericCopy

GenericCopyUmožňuje zadat SourceType a DestinationType jako argumenty šablony.Zde je nejobecnější formě GenericCopy z VCUE_Copy.h třídy:

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 obsahuje také následující specializace této třídy: GenericCopy<BSTR> , GenericCopy<VARIANT, BSTR> , GenericCopy<BSTR, VARIANT> .VCUE_CopyString.h obsahuje odborností pro kopírování z std::strings: GenericCopy<std::string> , GenericCopy<VARIANT, std::string> , a GenericCopy<BSTR, std::string> .Mohou zvýšit GenericCopy poskytnutím další vlastní specializace.

MapCopy

MapCopypředpokládá, že data kopírována uloží v mapě STL styl tak umožňuje určit typ mapy, ve kterém jsou data uložena a zadejte cíl.Implementace třídy právě používá funkce TypeDef poskytnutých MapType k určení typu zdrojových dat a volat příslušné třídy GenericCopy třídy.Žádné odborností této třídy jsou nezbytná.

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

Viz také

Koncepty

Implementace založené na STL kolekce

Vzorek ATLCollections