如何转换slist' node_ptr'到我自己的节点类型

时间:2014-11-30 16:23:00

标签: c++ boost intrusive-containers

我已声明以下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*吗?它应该是哪种铸造?

1 个答案:

答案 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_traitsto_value_ptrto_node_ptr都是身份函数。