ここまでのコードに登場した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>
に型Tを束縛するには、basic_container<AP>と記述する。これはbasic_container<AP>::template bind<T>::typeの別名である。また、container<T, AP>から型Tの束縛を解除するには、container<T, AP>と記述する。これはcontainer<T, AP>::unbindの別名である。
basic_container<AP>
標準アロケータが用いているのような、型TのコンテナAllocator::rebind<U>::otherを型Uのコンテナへと変換する操作を行うには、container<T, AP>と記述すればよい。この際、格納する型はTからUへと変換されるが、ポリシーcontainer<T, AP>::unbind::template bind<U>::typeAPはそのまま残される。