5.4. ホスト化されたポリシー

ポリシークラスそれ自身をホストクラスにすることができる。以下の例は、オブジェクトの割り当てと開放を行うポリシーと、オブジェクトの構築と破壊を行うポリシーの2つの下位ポリシーを取るポリシーである。

例 5.12. ホストクラスでもあるポリシークラス

template <typename T, class AP, class CP>
class storage_policy_pointer_backend
  : public AP::template bind<T>::type, public CP::template bind<T>::type
{
private:
  typedef typename AP::template bind<T>::type allocation_policy;
  typedef typename CP::template bind<T>::type construction_policy;
protected:
  // ...
};

struct storage_policy_pointer
{
  template <typename T, class AP, class CP>
  struct bind { typedef storage_policy_pointer_backend<T, AP, CP> type; };
};

template <typename T, class AP, class CP, class SP>
class container
  : public SP::template bind<T, AP, CP>::type
{
private:
  typedef typename SP::template bind<T, AP, CP>::type storage_policy;
public:
  // ...
};

void foo()
{
  typedef int T;
  typedef allocation_policy_new AP;
  typedef construction_policy_std CP;
  typedef storage_policy_pointer SP;
  typedef container<T, AP, CP, SP> C;
}

storage_policy_pointerは、2つの下位ポリシーを取るポリシークラスである。2相テンプレートを実装に用いており、2つの下位ポリシーをバックエンドへのテンプレートパラメータとして取る。バックエンドstorage_policy_pointer_backendは、一部の機能を下位ポリシーに委譲する。下位ポリシーから見ればstorage_policy_pointerはホストクラスである。

ホストクラスcontainerは、テンプレートパラメータとして3つのポリシークラスを取る。そのうち2つのポリシー: APCPは自身では使用せず、SPの実体化のためのテンプレートパラメータに与えることだけを行う。

クライアントコードfooは、使いたいポリシークラスを選択しホストクラスに与える。各ポリシークラスの実装形態などの詳細について意識する必要はない。

ホスト化されたポリシークラスは、プロキシパターンやアダプタパターンなど、他の任意のポリシーに依存するポリシーの実装に用いられる。項5.5. 「プロキシポリシー」を参照のこと。