ATL 복사 정책 클래스

복사 정책 클래스는 데이터를 초기화, 복사, 삭제하는 데 사용되는 유틸리티 클래스입니다. 복사 정책 클래스를 사용하면 모든 데이터 형식에 대한 복사 의미 체계를 정의하고 서로 다른 데이터 형식 간의 변환을 정의할 수 있습니다.

ATL은 다음 템플릿의 구현에서 복사 정책 클래스를 사용합니다.

ATL 개발자는 템플릿 인수로 전달될 수 있는 복사 정책 클래스에서 데이터를 복사하거나 변환하는 데 필요한 정보를 캡슐화함으로써 이러한 클래스의 재사용성을 극대화했습니다. 예를 들어 임의의 데이터 형식을 사용하여 컬렉션을 구현해야 하는 경우 적절한 복사 정책만 제공하면 됩니다. 컬렉션을 구현하는 코드를 건드릴 필요가 없습니다.

정의

정의상 다음 정적 함수를 제공하는 클래스는 복사 정책 클래스입니다.

static void init( DestinationType * p);

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

static void destroy( DestinationType * p);

각 복사 정책에 대해 DestinationTypeSourceType 형식을 임의의 데이터 형식으로 바꿀 수 있습니다.

참고 항목

모든 임의 데이터 형식에 대해 복사 정책 클래스를 정의할 수 있지만 ATL 코드에서 클래스를 사용하는 경우 적합한 형식으로 제한되어야 합니다. 예를 들어 ATL의 컬렉션 또는 열거자 구현과 함께 복사 정책 클래스를 사용하는 경우 DestinationType은 COM 인터페이스 메서드에서 매개 변수로 사용할 수 있는 형식이어야 합니다.

init를 사용하여 데이터를 초기화하고, copy를 사용하여 데이터를 복사하고, destroy를 사용하여 데이터를 해제합니다. 초기화, 복사, 소멸의 정확한 의미는 복사 정책 클래스의 영역이며 관련된 데이터 형식에 따라 달라집니다.

복사 정책 클래스의 사용 및 구현에는 다음 두 가지 요구 사항이 있습니다.

  • copy의 첫 번째 매개 변수는 이전에 init를 사용하여 초기화한 데이터에 대한 포인터만 수신해야 합니다.

  • destroy는 이전에 init를 사용하여 초기화했거나 copy를 통해복사한 데이터에 대한 포인터만 수신해야 합니다.

표준 구현

ATL은 _Copy_CopyInterface 템플릿 클래스 형식으로 두 가지 복사 정책 클래스를 제공합니다.

  • _Copy 클래스는 DestinationTypeSourceType을 모두 지정하는 단일 템플릿 매개 변수만 제공하므로 동종 복사만 허용합니다(데이터 형식 간 변환은 허용되지 않음). 이 템플릿의 제네릭 구현에는 초기화 또는 소멸 코드가 포함되어 있지 않으며 memcpy를 사용하여 데이터를 복사합니다. ATL은 또한 VARIANT, LPOLESTR, OLEVERB, CONNECTDATA 데이터 형식에 대한 _Copy 특수화를 제공합니다.

  • _CopyInterface 클래스는 표준 COM 규칙에 따라 인터페이스 포인터를 복사하기 위한 구현을 제공합니다. 이 클래스도 동종 복사만 허용하므로 간단한 할당과 AddRef 호출을 사용하여 복사를 수행합니다.

사용자 지정 구현

일반적으로 이종 복사(데이터 형식 간 변환)를 위해 고유한 복사 정책 클래스를 정의해야 합니다. 사용자 지정 복사 정책 클래스의 몇 가지 예는 ATLCollections 샘플의 VCUE_Copy.h 및 VCUE_CopyString.h 파일을 참조하세요. 이러한 파일에는 두 가지 템플릿 복사 정책 클래스인 GenericCopyMapCopy와 여러 데이터 형식에 대한 GenericCopy의 다양한 특수화가 포함되어 있습니다.

GenericCopy

GenericCopy를 사용하면 SourceTypeDestinationType을 템플릿 인수로 지정할 수 있습니다. 다음은 VCUE_Copy.h에서 가져온 GenericCopy 클래스의 가장 일반적인 형식입니다.

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::strings에서 복사하기 위한 특수화 GenericCopy<std::string>, GenericCopy<VARIANT, std::string>, GenericCopy<BSTR, std::string>가 포함되어 있습니다. 자체적으로 추가 전문화를 제공하여 GenericCopy를 발전시킬 수 있습니다.

MapCopy

MapCopy는 복사되는 데이터가 C++ 표준 라이브러리 스타일 맵에 저장되어 있다고 가정하므로 데이터가 저장되는 맵 형식과 대상 형식을 지정할 수 있습니다. 클래스 구현에서는 MapType 클래스에서 제공하는 typedef를 사용하여 원본 데이터의 형식을 결정하고 적절한 GenericCopy 클래스를 호출합니다. 이 클래스의 전문화는 필요하지 않습니다.

template <class MapType, class DestinationType = MapType::mapped_type>
class MapCopy
{
public :
   typedef DestinationType               destination_type;
   typedef typename MapType::value_type  source_type;
   
   typedef MapType                       map_type;
   typedef typename MapType::mapped_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

참고 항목

C++ 표준 라이브러리 기반 컬렉션 구현
ATLCollections 샘플