具有通用指针类型的自链接类的类设计

时间:2011-04-07 16:09:19

标签: c++ boost interprocess allocator


我目前正在修改一个复杂的类,其节点指向自己就像链接列表或图形一样。我希望它使用 boost :: interprocess 函数在共享内存中使用。现在我正在寻找重新设计它的方法,使其保持通用性并且涉及的变化最小。

template< class T >  
class node {  
  public:  
    T data;  
    node* prev;  
    node* next;  
};

重新设计应该使用 boost :: interprocess :: allocator 分配器,以隐式使用 boost :: interprocess :: offset_ptr 类型的相对智能指针。我认为它应该涉及第二个模板参数,如

template< class T, class alloc_type = std::allocator< node< T > > >  
class node {
  public:  
    T data;  
    typename alloc_type::pointer prev;  
    typename alloc_type::pointer next;  
};

当然,由于循环依赖性,它与参考文献一样不起作用 我希望能够从C ++类模板专家那里得到一些帮助,以实现它的最佳方式。我看一下boost共享内存启用的容器,但是它们以一种相当复杂的方式解决它,涉及多个外部类。

荷兰Joh

2 个答案:

答案 0 :(得分:1)

  

由于循环依赖性,这当然不起作用,就像参考一样。

是的,这不起作用,因为正在定义类型node并且尚未完成,但您将其作为类型参数传递给allocator。因此问题!

此外,node是一个类模板,但当您将其传递给allocator时,您不会为node提供类型参数。但是不要担心,即使你通过,它也不会起作用,因为类型node尚未完成(正如我之前所说)。


除此之外你还有另一个问题,

alloc_type::pointer prev;  
alloc_type::pointer next;  

您需要typename作为

typename alloc_type::pointer prev;  
typename alloc_type::pointer next;  

答案 1 :(得分:0)

在我看来,allocator类属于容器,而不是元素。我意识到,对于像你这样的侵入式容器,它们可以是相同的。但是,我们可以把它归还吗?

怎么样:

#include <memory>

template <class T, class alloc_type >
struct nodePtr {
    typedef typename alloc_type::pointer pointer;
    typedef alloc_type allocator;
};


template< class T >
class node {
  public:
    typedef nodePtr<node<T>, std::allocator<node<T> > > pointer;
    // OR: typedef nodePtr<node<T>, my_allocator<node<T> > > pointer;
    T data;
    pointer prev;
    pointer next;
};

node<int> n;

当然,我无法弄清楚如何将std::allocator<>传递给node<>,但也许您不需要这样做。您是否介意在class node

的中间指定分配器的名称

或许,我们可以让你的分配器成为nodePtr的默认分配器?

// untested
template <class T> class node;
template <class T, class alloc_type = my_allocator<node<T> > >
class nodePtr { /* ... */ };
template <class T> class node {
    public: typename nodePtr<T> prev;
}