次の方法で共有


CComEnumOnSTL クラス

このクラスは、C++ 標準ライブラリ コレクションに基づいて COM 列挙子オブジェクトを定義します。

構文

template <class Base,
    const IID* piid, class T, class Copy, class CollType, class ThreadModel = CComObjectThreadModel>
class ATL_NO_VTABLE CComEnumOnSTL : public IEnumOnSTLImpl<Base, piid,
T,
    Copy,
CollType>,
    public CComObjectRootEx<ThreadModel>

パラメーター

Base
COM 列挙子です。 例については、IEnumString に関する記事を参照してください。

piid
列挙子インターフェイスのインターフェイス ID へのポインター。

T
列挙子インターフェイスによって公開される項目の型。

コピー
コピー ポリシー クラス

CollType
C++ 標準ライブラリ コンテナー クラス。

解説

CComEnumOnSTL では、C++ 標準ライブラリ コレクションに基づいて COM 列挙子オブジェクトを定義します。 このクラスは独自で使うことも、ICollectionOnSTLImpl と組み合わせて使うこともできます。 このクラスを使うための一般的な手順を次に示します。 詳細については、「ATL コレクションと列挙子」を参照してください。

ICollectionOnSTLImpl と共にこのクラスを使う場合:

  • このクラスの特殊化に typedef を使用します。

  • ICollectionOnSTLImpl の特殊化で最後のテンプレート引数としてその typedef を使います。

例については、「ATL コレクションと列挙子」を参照してください。

ICollectionOnSTLImpl とは無関係にこのクラスを使う場合:

  • このクラスの特殊化に typedef を使用します。

  • CComObject の特殊化でテンプレート引数としてその typedef を使います。

  • CComObject 特殊化のインスタンスを作成します。

  • IEnumOnSTLImpl::Init を呼び出して、列挙子オブジェクトを初期化します。

  • クライアントに列挙子インターフェイスを返します。

継承階層

CComObjectRootBase

Base

CComObjectRootEx

IEnumOnSTLImpl

CComEnumOnSTL

要件

ヘッダー: atlcom.h

次に示すコードは、列挙子オブジェクトの作成と初期化を処理するジェネリック関数を示しています。

template <class EnumType, class CollType>
HRESULT CreateSTLEnumerator(IUnknown** ppUnk, IUnknown* pUnkForRelease, 
   CollType& collection)
{
   if (ppUnk == NULL)
      return E_POINTER;
   *ppUnk = NULL;

   CComObject<EnumType>* pEnum = NULL;
   HRESULT hr = CComObject<EnumType>::CreateInstance(&pEnum);

   if (FAILED(hr))
      return hr;

   hr = pEnum->Init(pUnkForRelease, collection);

   if (SUCCEEDED(hr))
      hr = pEnum->QueryInterface(ppUnk);

   if (FAILED(hr))
      delete pEnum;

   return hr;
} // CreateSTLEnumerator

次に示すように、この関数テンプレートを使用して、コレクション インターフェイスの _NewEnum プロパティを実装できます。

typedef CComEnumOnSTL<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT>,
   std::vector<CComVariant> > VarVarEnum;

class ATL_NO_VTABLE CVariantCollection :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CVariantCollection, &CLSID_VariantCollection>,
   public IDispatchImpl<IVariantCollection, &IID_IVariantCollection, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
   std::vector<CComVariant> m_vec;

   STDMETHOD(get__NewEnum)(IUnknown** ppUnk)
   {
      return CreateSTLEnumerator<VarVarEnum>(ppUnk, this, m_vec);
   }

   // Remainder of class declaration omitted.

このコードでは、IEnumVariant インターフェイスを使用して、CComVariant のベクトルを公開する CComEnumOnSTLtypedef を作成します。 CVariantCollection クラスは、シンプルに CreateSTLEnumerator を特殊化して、この型の列挙子オブジェクトを操作できるようにします。

関連項目

IEnumOnSTLImpl
ATLCollections サンプル: ICollectionOnSTLImpl、CComEnumOnSTL、カスタム コピー ポリシー クラスの使用例
クラスの概要
CComObjectRootEx クラス
CComObjectThreadModel
IEnumOnSTLImpl クラス