다음을 통해 공유


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를 사용하여 데이터를 초기화하고, 복사하여 데이터를 복사하고, 삭제하여 데이터를 해제합니다. 초기화, 복사 및 소멸의 정확한 의미는 복사 정책 클래스의 도메인이며 관련된 데이터 형식에 따라 달라집니다.

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

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

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

표준 구현

ATL은 _Copy_CopyInterface 템플릿 클래스 형식의 두 개의 복사 정책 클래스를 제공합니다.

  • 이 클래스는 _Copy 단일 템플릿 매개 변수만 제공하여 DestinationType을 둘 다 지정하기 때문에(데이터 형식 간 변환이 아님) 같은 유형의 복사만 허용합니다. 이 템플릿의 제네릭 구현에는 초기화 또는 소멸 코드가 포함되지 않으며 데이터를 복사하는 데 사용됩니다 memcpy . 또한 ATL은 VARIANT, LPOLESTR, OLEVERB 및 CONNECTDATA 데이터 형식에 대한 특수화를 _Copy 제공합니다.

  • 이 클래스는 _CopyInterface 표준 COM 규칙에 따라 인터페이스 포인터를 복사하기 위한 구현을 제공합니다. 다시 한 번 이 클래스는 같은 유형의 복사만 허용하므로 단순 할당 및 호출을 AddRef 사용하여 복사를 수행합니다.

사용자 지정 구현

일반적으로 이질적인 복사(즉, 데이터 형식 간 변환)를 위해 고유한 복사 정책 클래스를 정의해야 합니다. 사용자 지정 복사 정책 클래스의 몇 가지 예제는 ATLCollections 샘플에서 VCUE_Copy.h 및 VCUE_CopyString.h 파일을 참조하세요. 이러한 파일에는 두 개의 템플릿 복사 정책 클래스 GenericCopyMapCopy가 있으며, 다양한 데이터 형식에 대한 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::string으로부터 복사하기 위한 특수화가 포함되어 있습니다: 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++ 표준 Library-Based 컬렉션 구현
ATLCollections 샘플