Сохраните карту STL в Boost ConstBufferSequence
Я пытаюсь хранить std::map<enum, int>
в boost::beast::multi_buffer
, До сих пор я использовал boost::asio::buffer_copy
а также boost::asio::buffer
хранить векторы и POD ы. Однако я не смог найти способ хранить карту STL.
Я пробовал это:
auto t_map = std::map<CODES, int>(); // CODES is an enum type
auto t_map_size = t_map.size() * sizeof(std::pair<CODES, int>);
auto tmp_buffer = boost::asio::buffer(t_map, t_map_size); // this is not supported
auto size = boost::asio::buffer_copy(t_map_size , tmp_buffer);
boost::beast::multi_buffer buffer;
buffer.commit(size);
- Есть ли способ сохранить
std::map<enum, int>
вConstBufferSequence
? (посколькуboost::asio::buffer_copy
нужен один) - Если нет, есть ли обходной путь для хранения
std::map<enum, int>
вboost::beast::multi_buffer
?
Спасибо!
1 ответ
Решение
Вы можете преобразовать вашу карту в вектор POD, так как POD выбирает тип, который может хранить, например, enum + int int64_t
:
Итак, создайте вектор, сканируйте карту, создавая элементы вектора, используя побитовые операции, и данные готовы:
auto t_map = std::map<CODES, int>(); // CODES is an enum type
std::vector<int64_t> vec;
for (auto&& elemMap : t_map)
{
int64_t val = elemMap.first; // store key
val <<= 32; // shift key
val |= elemMap.second; // store value
vec.push_back (val);
}
auto tmp_buffer = boost::asio::buffer(vec); // this is supported
Распаковать вектор на карту должно быть легко.