как конвертировать slist ‘node_ptr’ в мой собственный тип узла

Я объявил следующее 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

Решение

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 будет функция идентичности.

1

Другие решения


По вопросам рекламы [email protected]