每个分配器类都必须有一个类似于以下的接口:
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
,但他们仍然可以从模板模板参数中受益。)
编辑:
但是,如果您需要超过 1 个模板参数,这将不起作用!
实际上,它的效果非常好!
template<unsigned int PoolSize>
struct pool
{
template<class T>
struct allocator
{
T pool[PoolSize];
...
};
};
现在 ifvector
只是这样定义的:
template<class T, template<class> class Alloc>
class vector { ... };
然后你可以说:
typedef vector<int, pool<1>::allocator> int_vector;
它会很好地工作,而不需要你(多余地)说int
两次。
并且rebind
内部的操作vector
将变成Alloc<Other>
而不是Alloc::template rebind<Other>::other
.