3


現在、リンクされたリストやグラフのように自分自身を指す ノードを持つ複雑なクラスを変更しています。boost::interprocess関数を使用して共有メモリで使用したい。現在、汎用性を保ち、変更が最小限になるように再設計する方法を探しています。

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

再設計では、 boost ::interprocess::offset_ptr型の相対スマート ポインターを暗黙的に使用するために、 boost::interprocess ::allocatorアロケーターを使用する必要があります。次のような2番目のテンプレートパラメーターを含める必要があると思いました

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++ クラス テンプレートの専門家から助けを得られることを願っています。ブースト共有メモリ対応のコンテナーを見てみましたが、いくつかの外部クラスが関与するかなり複雑な方法で解決しています。

ジョー

4

2 に答える 2

1

もちろん、参照の場合と同様に、循環依存関係のために機能しません。

はい、型nodeが定義されていてまだ完了していないため、機能しませんがallocator、型パラメーターとして渡しています。したがって、問題!

また、nodeはクラス テンプレートですが、それを に渡すときに、 のallocator型引数を提供していませんnode。しかし、心配しないでください。パスしたとしても、typenodeはまだ完全ではないため、機能しません (前に述べたように)。


それに加えて、別の問題があります。

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 に答える