将STL映射存储到Boost ConstBufferSequence中

问题描述 投票:1回答:1

我正试图将std::map<enum, int>存放在boost::beast::multi_buffer中。到目前为止,我一直在使用boost::asio::buffer_copyboost::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);
  1. 有没有办法在std::map<enum, int>存储ConstBufferSequence? (因为boost::asio::buffer_copy需要一个)
  2. 如果没有,是否有任何解决方法将std::map<enum, int>存储在boost::beast::multi_buffer中?

谢谢!

c++ boost boost-asio boost-beast beast-websockets
1个回答
2
投票

您可以将地图转换为POD的向量,因为POD选择可以存储枚举+ 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

将矢量解压缩到地图应该很容易。

© www.soinside.com 2019 - 2024. All rights reserved.