ここまでの説明ではコンテナに与えるポリシークラスとしてBezelが提供するものを用いたが、ユーザがポリシークラスを定義してもよい。コンテナは、与えられたポリシークラスがBezelが定義したものなのかユーザが定義したものなのかを区別しない。
各々のポリシーについて、ポリシークラスに対する要件が文書で定義されている。例えば配列割り当てポリシーであれば、要件は項6.2.2. 「要件」に記載の通りである。ユーザ自身の手でポリシークラスを実装するときは、すべての要件を満たすようにする必要がある。
例として、std::mallocおよびstd::freeに似たインタフェースを持つmyallocとmyfreeを用いて記憶領域割り当てを行う配列割り当てポリシーmypolicyを定義し、vectorに与えて用いるコードを以下に示す。
例 3.16. ユーザ定義ポリシー
#include <cstddef>
#include <limits>
#include <bezel/vector.h>
#include "myalloc.h"
template <
std::size_t sizeof_value
>
class mypolicy_backend;
struct mypolicy
{
template <std::size_t N>
struct bind { typedef mypolicy_backend<N> type; };
};
template <std::size_t N>
class mypolicy_backend
{
public:
typedef std::size_t size_type;
struct initializer {};
protected:
explicit mypolicy_backend(initializer = initializer())
{}
~mypolicy_backend() throw()
{}
static void swap(mypolicy_backend&) throw()
{}
static initializer get_initializer()
{ return initializer(); }
private:
mypolicy_backend& operator=(const mypolicy_backend&);
protected:
static size_type max_size()
{ return std::numeric_limits<size_type>::max() / N; }
static void* allocate(size_type n)
{ return myalloc(n * N); }
static void deallocate(void* p, size_type /* n */) throw()
{ myfree(p); }
};
void foo()
{
using namespace bezel::vector;
typedef vector<int, allocation_is<mypolicy> > C;
...
}