Я объявил следующее 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*
? какой кастинг должен быть?
get_root_node
не является частью документированного API.
Вы ищете
InputBufferSglNode& node = *this->begin();
Если вы заинтересованы в обратном:
ОБНОВИТЬ:
Я прочел еще кое-что в документации, и есть способ, которым вы можете делать то, что хотите, используя производные value_traits для вашего типа списка:
InputBufferSglNode* node =
InputBufferSglList::value_traits::to_value_ptr(list.get_root_node());
Это использует Интерфейс ValueTraits это лежит в основе всех навязчивых контейнеров.
Для всех обычных хуков по умолчанию для узла это приведет к некоторой арифметике смещения (чтобы перейти от адреса члена к адресу узла, например). Но на практике это может включать в себя приведение вверх и вниз по иерархии классов (особенно когда задействованы виртуальные базы).
Для любого trivial_value_traits и то и другое to_value_ptr
а также to_node_ptr
будет функция идентичности.