如何将列表'node_ptr'转换为我自己的节点类型



我已经声明了以下继承自boost::intrusive::slist_base_hook<> node

class InputBufferSglNode : public boost::intrusive::slist_base_hook<>

声明包含这些节点的列表:

class InputBufferSglList : public boost::intrusive::slist<InputBufferSglNode, boost::intrusive::cache_last<true>>

我想从InputBufferSglList成员函数中获取根节点,所以我尝试这样做:

InputBufferSglNode* node = this->get_root_node();但是我收到一个错误:

error: cannot initialize a variable of type 'InputBufferSglNode *' with an rvalue of type 'node_ptr' (aka 'boost::intrusive::slist_node<void *> *')

我应该node_ptrInputBufferSglNode*吗? 应该投哪个选角?

get_root_node不是

记录的API的一部分。

你在寻找吗

InputBufferSglNode& node = *this->begin();

如果您对相反的情况感兴趣:

  • http://www.boost.org/doc/libs/1_57_0/doc/html/intrusive/obtaining_iterators_from_values.html

更新:

我已经在文档中阅读了更多内容,并且有一种方法可以通过对列表类型使用派生value_traits来执行所需的操作:

InputBufferSglNode* node = 
      InputBufferSglList::value_traits::to_value_ptr(list.get_root_node());

这使用作为所有侵入性容器基础的 ValueTraits 接口

对于所有常见的节点默认钩子,它将导致一些偏移算法(例如,从成员地址到节点地址)。但在实践中,它可能涉及上下转换类层次结构(特别是当涉及虚拟基地时)。

对于任何trivial_value_traits,to_value_ptrto_node_ptr都是恒等函数。

相关内容

最新更新