![]() |
Boost : |
From: Sebastian Redl (sebastian.redl_at_[hidden])
Date: 2007-09-22 06:22:33
Larry Evans wrote:
> BTW, I'm trying to do std::list<T> correctly; however,
> I'm having problems. It appears allocator::pointer
> doesn't help when using:
>
> struct node
> {
> T elem;
> node* next_;
> node* prev_;
> };
>
> because the begin/end pointers are to node* not to T*.
>
That's what the rebind mechanism is for. Suppose your allocator
parameter is Alloc:
template<typename T, typename Alloc = std::allocator<T> >
class list
{
};
Then first you need the node allocator:
typedef typename Alloc::template rebind<node<T> >::other node_allocator;
Then you can get the new allocator's pointer type:
typedef typename node_allocator::pointer node_ptr;
class node
{
T elem;
node_ptr next;
node_ptr prev;
};
Don't forget to construct the node_allocator member you'll hold from the
allocator you're passed in. All allocators must have a templated
constructor for this purpose.
Something most implementations do, by the way, is that they are written
in such a way that EBO applies to the allocator if it has no state.
Sebastian Redl
Boost list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk