ポリシークラスそれ自身をホストクラスにすることができる。以下の例は、オブジェクトの割り当てと開放を行うポリシーと、オブジェクトの構築と破壊を行うポリシーの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つのポリシー: APとCPは自身では使用せず、SPの実体化のためのテンプレートパラメータに与えることだけを行う。
クライアントコードfooは、使いたいポリシークラスを選択しホストクラスに与える。各ポリシークラスの実装形態などの詳細について意識する必要はない。
ホスト化されたポリシークラスは、プロキシパターンやアダプタパターンなど、他の任意のポリシーに依存するポリシーの実装に用いられる。項5.5. 「プロキシポリシー」を参照のこと。