如何检索缓冲区中存储的数据类型并将其传递给模板?

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

我有一个问题,当我调用 async_read 时,我不知道用户发送的确切数据类型,因此我需要从 asio::streambuf 检索它并将其传递给 asio::buffer_cast 模板。我们还知道数据类型始终是元组,其中第一个元素是字符串。

这是部分代码:

private:
tcp::socket             socket_;
asio::streambuf         incoming_;

void readLoop() {
    asio::async_read_until(
        socket_, incoming_, '\n', [&, self = shared_from_this()](error_code ec, size_t n) {

            if (ec) {
                std::cout << "Client disconnect (" << ec.message() << ")" << std::endl;
                return;
            }

            const ???* ptr = asio::buffer_cast<???>(incoming_.data());
            const std::string query = std::get<0>(*ptr);

            .....
            
            incoming_.consume(n);

            readLoop();
        });
}

我尝试使用 boost-type-index 模块,但它无法按我需要的方式工作。 所以我希望你能告诉我如何做到这一点,或者至少有任何解决问题的提示

c++ boost boost-asio asio
1个回答
0
投票

您始终必须知道类型。

可以有一个类型列表(并且确实可以通过某种(便携式!)类型ID进行切换)。

在没有给定上下文的情况下,我可以给出的最佳建议是查看现有的序列化/反序列化技术。

  • 使用 JSON
  • 使用Boost序列化档案

这个网站上有很多例子(例如 Boost easter 将带有字节数组的 json 发送到客户端抛出 websocketboost::asio::async_read_until 与自定义 match_char 仅接受 JSON 格式Boost.beast:如何仅返回 json 响应,或用于序列化存档:C++ boost asio:带有 boost:asio::read 和 boost::asio::write 的简单服务器/客户端,传递 int 向量在 boost 中发送/接收结构::asio

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