CUJ:标准库:Allocator能做什么?[13]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 taodm 的 blog

    这个过程需要处理两个不同的allocator,其中一个是通过对另一个的重绑定而获得的。它对几乎所有程序都工作得很好,即使是将allocator用于相当复杂的目的的程序。它所不能完成的是向allocator提供一些不寻常的指针类型。它明显依赖于能使用list_node<t> *类型的普通指针。

    如果你极端野心勃勃,想将其它可能的指针类型传给allocator,一切都突然变得复杂多了--从一个节点指向另一个节点的指针不再是list_node<t> *或void *了,但它必须是能够从allocator获取的某个类型。直接实现是不太可能的:用一个不完全的类型实例化allocator是非法的,因此,除非list_node已经被完整定义,否则无法谈论指向list_node的指针。我们需要一个精巧的申明顺序。

    template <class t, class pointer>

    struct list_node

    {

      t val;

      pointer next;

    };

    template <class t, class alloc>

    class list : private alloc

    {

    private:

      typedef typename alloc::template rebind<void>::other 

              void_alloc;

      typedef typename void_alloc::pointer voidptr;

      typedef typename list_node<t, voidptr> node;

      typedef typename alloc::template rebind<node>::other

              node_alloc;

      typedef typename node_alloc::pointer nodeptr;

本文关键:CUJ、allocator、STL、Matt Austern
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top