5.2.5. bindunbind

ここまでのコードに登場したbindは、フロントエンドからバックエンドを導出するために、テンプレートパラメータを束縛する手段である。この逆の操作、すなわち束縛を解除する操作を実現することもできる。以下に例を示す。

例 5.10. bindとunbind

template <class AP>
basic_container;

template <typename T, class AP>
container
  : public AP::template bind<T>::type
{
public:
  typedef basic_container<AP> unbind;
  // ...
};

template <class AP>
basic_container
{
  template <typename T>
  struct bind { typedef container<T, AP> type; };
};

containerは、1つのポリシークラスを取る、型Tのためのコンテナである。また、basic_containerは、1つのポリシークラスを取る、型Tを束縛する前のコンテナの雛型を扱うためのクラステンプレートである。例えば、ポリシーの選択は決まっているが格納するべき型がまだ決まっていないコンテナは、basic_container<AP>と記述できる。

basic_container<AP>に型Tを束縛するには、basic_container<AP>::template bind<T>::typeと記述する。これはcontainer<T, AP>の別名である。また、container<T, AP>から型Tの束縛を解除するには、container<T, AP>::unbindと記述する。これはbasic_container<AP>の別名である。

標準アロケータが用いているAllocator::rebind<U>::otherのような、型Tのコンテナcontainer<T, AP>を型Uのコンテナへと変換する操作を行うには、container<T, AP>::unbind::template bind<U>::typeと記述すればよい。この際、格納する型はTからUへと変換されるが、ポリシーAPはそのまま残される。