すべてのアロケーター クラスには、次のようなインターフェイスが必要です。
template<class T>
class allocator
{
...
template<class Other>
struct rebind { typedef allocator<Other> other; };
};
また、アロケーターを使用するクラスは、次のように冗長なことを行います。
template<class T, class Alloc = std::allocator<T> >
class vector { ... };
しかし、なぜこれが必要なのですか?
言い換えれば、彼らは次のように言うことができませんでした:
template<class T>
class allocator { ... };
template<class T, template<class> class Alloc = std::allocator>
class vector { ... };
どちらがよりエレガントで、冗長性が低く、(いくつかの同様の状況では) 潜在的に安全ですか?
なぜ彼らはそのrebind
ルートをたどったのT
ですか?
(同様の質問がchar_traits
他にもあります... すべてが を持っているわけではありませんがrebind
、テンプレート テンプレート パラメータの恩恵を受けることができます。)
編集:
ただし、複数のテンプレート パラメーターが必要な場合、これは機能しません。
実際、それは非常にうまく機能します!
template<unsigned int PoolSize>
struct pool
{
template<class T>
struct allocator
{
T pool[PoolSize];
...
};
};
vector
がこのように定義されている場合:
template<class T, template<class> class Alloc>
class vector { ... };
次に、次のように言うことができます。
typedef vector<int, pool<1>::allocator> int_vector;
そして、(冗長に) 2回言う必要がなくても、完全にうまく機能します.int
そして、rebind
内部の操作はの代わりにvector
なります。Alloc<Other>
Alloc::template rebind<Other>::other