我目前正在修改一个复杂的类,其节点指向自己就像链接列表或图形一样。我希望它使用 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
答案 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;
}