共用方式為


ATL 複製原則類別

複製原則類別是用來初始化, 公用程式類別。 、複製和刪除資料。 複製原則類別可讓您定義任何資料型別的複製語意和定義不同的資料型別之間的轉換。

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 初始化資料、 copy 至資料複製並 destroy 釋放資料。 初始化的確切意義,複製和解構是複製原則類別的網域,並根據所包含之資料型別的變更。

在使用和實作的需求複製原則類別:

  • copy 的第一個參數必須只接收指標使用 init,您先前已初始化的資料。

  • destroy 只接收指標至您先前已經初始化使用 init 或透過 copy已複製的資料。

標準實作

_Copy_CopyInterface 樣板類別 (Class) 的形式, ATL 提供兩個複本原則類別:

  • _Copy 類別允許同質只複製 (在資料型別之間的不是轉換),因為它只提供一個樣板參數指定 DestinationType 和 SourceType。 這個樣板的泛用實作不包含初始化或終結程式碼並使用 memcpy 複製資料。 ATL 提供 VARIANTLPOLESTROLEVERBCONNECTDATA 資料型別也提供 _Copy 的特製化。

  • 在標準 COM 規則之後, _CopyInterface 類別提供複製之介面指標的實作。 接著這個類別允許同質只複製,因此,使用簡單的指派就和對 AddRef 執行該複本。

自訂實作。

一般而言,您會需要定義您異質複製的自訂複製原則類別 (也就是在資料型別之間的轉換)。 對於自訂複製原則類別的範例,請參閱 ATLCollections 範例的檔案 VCUE_Copy.h 和 VCUE_CopyString.h。 這些檔案包含兩個範本複製原則類別, GenericCopy 和 MapCopy,加上 GenericCopy 的特製化不同資料型別的。

td6kz9x0.collapse_all(zh-tw,VS.110).gifGenericCopy

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個: GenericCopy_<std::string_>、 GenericCopy_<VARIANT, std::string_>和 GenericCopy_<BSTR, std::string_>。 您可以提供自己的進一步特製化 GenericCopy 引發。

td6kz9x0.collapse_all(zh-tw,VS.110).gifMapCopy

MapCopy 假設,複製的資料是以演算式對應會儲存,因此,它可讓您指定要儲存資料和目的型別對應的型別。 類別的實作使用 MapType 類別所提供的 typedef 判斷來源資料的類型和呼叫適當的 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

請參閱

概念

實作以 STL 集合

ATLCollections 範例