我已经声明了以下继承自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_ptr
投InputBufferSglNode*
吗? 应该投哪个选角?
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_ptr
和to_node_ptr
都是恒等函数。