【问题标题】:Store a STL map into a Boost ConstBufferSequence将 STL 映射存储到 Boost ConstBufferSequence
【发布时间】:2019-02-15 08:33:04
【问题描述】:

我正在尝试将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&lt;enum, int&gt; 存储在ConstBufferSequence 中? (因为boost::asio::buffer_copy 需要一个)
  2. 如果没有,是否有任何解决方法可以将 std::map&lt;enum, int&gt; 存储在 boost::beast::multi_buffer 中?

谢谢!

【问题讨论】:

  • 您永远不能在 Asio 缓冲区(或序列)中“存储”任何内容,因为缓冲区仅 reference 现有数据。任何缓冲区都指的是 POD 数据的连续区域,并且缓冲区序列结合了其中的几个(以支持“收集”在内存中不一定连续的缓冲区)

标签: c++ boost boost-asio boost-beast beast-websockets


【解决方案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

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

【讨论】:

  • 酷。所以基本上,这种方式也是发送自定义类型的最佳选择?
  • @Shmwel asio::buffer的输入是有限的,它需要POD的向量,字符串,POD的数组,或者原始指针+大小,所以在进一步处理之前需要一些序列化方法来自定义数据。我的回答显示了一种可能的方法。
  • 我会远离低级黑客来“打包”值类型。事实上,它们已经足够 POD 了!您实际上可以像这样简洁:direct contiguous map copy。如果您查看生成的哈希摘要,您会发现它与corresponding take with manual bit-shifting hacks 完全相同
  • @Shmwel 查看使用 Json 或 Boost Serialization with Asio 的现有答案。
  • @sehe 你在对我大喊:D 我的目的是向 OP 展示一些序列化方法来实现他的目标的必要性。我不得不承认我的解决方案是矫枉过正。 pair&lt;some_int,int&gt; 作为“pod”可以直接存入vector。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2021-03-06
  • 2022-01-17
相关资源
最近更新 更多