3


我目前正在修改一个复杂的类,它的节点指向自己,就像链表或图一样。我希望它使用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 共享内存的容器,但他们正在以一种涉及多个外部类的相当复杂的方式解决它。

约翰

4

2 回答 2

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;  
于 2011-04-07T16:15:59.400 回答
0

在我看来,分配器类属于容器,而不是元素。我意识到,对于像您这样的侵入式容器,它们可以是相同的。但是,我们可以把它排除在外吗?

怎么样:

#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;
}
于 2011-04-07T17:39:06.587 回答