Как я могу использовать boost :: interprocess :: private_node_allocator в рекурсивной структуре данных? - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть рекурсивная структура данных, которую я хочу сохранить в общей памяти. До сих пор я получил это (упрощенно):

using namespace boost::interprocess;
typedef allocator<wchar_t, 
managed_shared_memory::segment_manager>TCharAllocator;
typedef basic_string<wchar_t, std::char_traits<wchar_t>, TCharAllocator> MyShmString;


class Node;
template<>
struct sizeof_value<Node>
{
    static const std::size_t value = *NodeSize*; <---??
};


typedef private_node_allocator<Node, managed_shared_memory::segment_manager> TNodeAllocator;

class Node
{
  private:
    MyShmString _value;
    vector<Node, TNodeAllocator> _children;
};

Если вы введете число для Nodesize, оно будет скомпилировано и запущено. Вы можете получить это число, скомпилировав и распечатав sizeof (Node). Это не очень надежно. Я попытался использовать функцию заранее объявленного constexpr, возвращающую размер узла, но это не компилируется (на MSVC). Есть ли другой способ решить эту проблему?

1 Ответ

0 голосов
/ 06 сентября 2018

Если я правильно понимаю, единственным источником осложнений является объявление структур данных, которые влекут за собой неполные типы.

Если специализация boost::interprocess::sizeof_value<> работает, этого будет достаточно. ¹

С точки зрения надежности, легко добавить static_assert после того, как определение Node завершено, чтобы убедиться, что фактическое значение соответствует размеру, указанному компилятором:

static_assert(boost::interprocess::sizeof_value<Node>::value == sizeof(Node), "sizeof mismatch");

¹ У меня есть догадка, что без этого можно обойтись, но я не могу тратить время на то, чтобы прямо сейчас сделать ваш код автономным, чтобы проверить

...