1

ブースト侵入リストで使用できるように、ブーストCNodeを継承するクラスがあります。list_base_hook

class CNode
   //Base hook with default tag, raw pointers and safe_link mode
   :public list_base_hook<>
{
   // Suppose the linked pointers inherited from list_base_hook
   // are "m_prev", "m_next".
};

ノードがリストからポップされると、別の FIFO にプッシュされます。その FIFO は を再利用して、シングル リーダー シングル ライター スレッド セーフ セマンティクスを実装しながらノードをリンクすることを計画してm_prevm_nextます。

私のFIFOで:

class CFIFO
{
public:
  void push_back(CNode *node)
  {
     // Is there any way to update the "m_next"/"m_prev" fields?
     // SetNextLink is faked here..
     m_tail->SetNextLink(node);
     ..
  }
};

m_prevm_nextフィールドを取得する方法はありますCNodeか?

4

2 に答える 2

1

リンクされたフィールドprev_next_は継承されlist_base_hookており、ベースで公開されているため、直接アクセスできます。

class MyNode: public list_base_hook<>
{
   //..
};

list<MyNode> myList;
for (list<MyNode>::iterator it = myList.begin(); it != myList.end(); ++it)
{
   // The type of the pointer is list<MyNode>::node_ptr
   cout << it->prev_ << it->next_ << endl;
}
于 2013-01-09T04:38:04.460 に答える
1

iterator_toを使用して、const 参照からイテレーターに移動できます。その後、反復子をデクリメントまたはインクリメントできます。実際にはs_iterator_to、二重にリンクされた侵入リストで使用できます。

更新:ああ、それらを「取得」したくない、変更したい。その場合、他の侵入型コンテナが実装されているのと同じ方法で、独自の侵入型コンテナを実装する必要があります。個人的には、侵入型リストを内部で使用するだけです。双方向にリンクされたリストを FIFO のように機能させることは、基本的に簡単です。

于 2013-01-08T12:23:35.910 に答える