Klasy zasad kopii ATL
Kopiuj zasady klasy są Narzędzie klasy używane do inicjowania, kopiowanie i usuwanie danych.Kopia zasad klasy pozwalają określić semantykę kopii dla dowolnego typu danych oraz określenie konwersje między różnymi typami danych.
Używa kopii zasady klasy ATL w jego implementacji następujących szablonów:
Przez enkapsulacji informacji potrzebnych do skopiowania lub przekonwertować dane klasy kopia zasad przekazaną jako argument szablonu, deweloperzy ATL zostały przewidziane extreme przydatności tych klas.Na przykład trzeba zaimplementować zbiór danych dowolnego typu, wystarczy podać jest kopia odpowiednie zasady; nigdy nie należy dotykać kod, który implementuje kolekcji.
Definicja
Z definicji klasy, która zapewnia następujące funkcje statyczny jest klasa zasad kopii:
static void init(DestinationType* p);
static HRESULT copy(DestinationType* pTo, const SourceType* pFrom);
static void destroy(DestinationType* p);
Można zastąpić typy DestinationType i SourceType z dowolnego typy danych dla każdej kopii zasady.
[!UWAGA]
Chociaż można zdefiniować kopii klas zasad dla wszystkich typów danych dowolnego, użycia klas w kodzie ATL należy ograniczyć typy sensu.Na przykład, gdy przy użyciu zasad kopii klasy ATL's kolekcji lub moduł wyliczający implementacji, DestinationType musi być używany jako parametr metody interfejsu COM typu.
Użyj init zainicjować danych, kopię do kopiowania danych, i zniszczyć zwolnić danych.Dokładne znaczenie inicjowania, kopiując i niszczenia są klasy Kopiuj zasady domeny i zależą od typów danych zaangażowane.
Istnieją dwa wymogi stosowania i wdrażania klasy zasad kopii:
Pierwszy parametr kopię tylko musi otrzymać wskaźnik do danych, które uprzednio zostały zainicjowane, korzystając z init.
zniszczenie tylko kiedykolwiek musi otrzymać wskaźnik do danych, które uprzednio zostały zainicjowane, korzystając z init lub kopiowane za pomocą kopię.
Standardowej implementacji
ATL oferuje dwie klasy zasad kopii w formie _Copy i _CopyInterface szablonu klasy:
_Copy klasy umożliwia kopiowanie tylko jednorodnej (nie konwersja między typami danych), ponieważ parametr jednego szablonu do określenia zarówno oferuje tylko DestinationType i SourceType.Rodzajowy realizacji tego szablonu nie zawiera żadnego kodu inicjowania lub niszczenia i używa memcpy , aby skopiować dane.ATL zapewnia także specjalności z _Copy dla WARIANTU, LPOLESTR, OLEVERB, i CONNECTDATA typów danych.
_CopyInterface klasy zapewnia implementację interfejsu wskaźniki standardowe reguły COM kopiowania.Ponownie tej klasy umożliwia tylko jednorodnej kopiowanie, więc używa prostego przydziału i wywołanie AddRef do wykonywania kopii.
Implementacje niestandardowe
Zazwyczaj trzeba definiować własne klasy zasad kopii heterogenicznych kopiowania (to znaczy, konwersja między typami danych).Niektóre przykłady kopii niestandardowych zasad klas, spójrz na pliki VCUE_Copy.h i VCUE_CopyString.h w ATLCollections próbki.Pliki te zawierają dwie klasy zasad kopię szablonu, GenericCopy i MapCopy, plus liczba specjalności z GenericCopy dla różnych typów danych.
GenericCopy
GenericCopyPozwala określić SourceType i DestinationType jako argumenty szablonu.Tutaj jest najbardziej powszechną formą GenericCopy klasy z 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 zawiera również następujące dziedziny specjalizacji tej klasy: GenericCopy<BSTR>, GenericCopy<VARIANT, BSTR>, GenericCopy<BSTR, VARIANT>.VCUE_CopyString.h zawiera specjalności kopiowania z szablonowejs: GenericCopy<std::string>, GenericCopy<VARIANT, std::string>, i GenericCopy<BSTR, std::string>.Można zwiększyć GenericCopy przez zapewnienie dalszych specjalności własny.
MapCopy
MapCopyzakłada się, że będą przechowywane mapie STL styl danych kopiowanych tak pozwala określić typ mapy, w którym przechowywane są i wpisz miejsce docelowe.Implementacji klasy używa tylko definicje TypeDef dostarczonych przez MapType klasy, aby określić typ danych źródłowych i wywoływać odpowiedni GenericCopy klasy.Potrzebne są nie specjalności tej klasy.
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