我已声明以下node
继承自boost::intrusive::slist_base_hook<>
:
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*
吗?它应该是哪种铸造?
答案 0 :(得分:1)
get_root_node
不是文档化API的一部分。
您在寻找
吗?InputBufferSglNode& node = *this->begin();
如果你对反向感兴趣:
<强>更新强>:
我在文档中已经阅读了更多内容,并且通过使用列表类型的派生value_traits,您可以通过某种方式执行您想要的操作:
InputBufferSglNode* node =
InputBufferSglList::value_traits::to_value_ptr(list.get_root_node());
这会使用 ValueTraits interface 作为所有侵入式容器的基础。
对于所有通常的节点默认挂钩,它将导致一些偏移算术(例如,从成员地址到节点地址)。但在实践中,它可能涉及在层次结构中上下流动(特别是当涉及虚拟基础时)。
对于任何trivial_value_traits,to_value_ptr
和to_node_ptr
都是身份函数。