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

How to retrieve the data type stored in buffer and pass it to the template?

提问人:Jésus Christophe 提问时间:10/21/2023 更新时间:10/21/2023 访问量:60

问:

我有一个问题,当我调用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-ASIO ASIO

评论


答:

1赞 sehe 10/21/2023 #1

你总是必须知道类型。

你可以有一个类型列表(实际上通过某种(可移植的!)类型 ID 进行切换)。

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

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

您不太可能“需要”,因为这仅适用于琐碎和标准布局类型(请参阅此处的示例 Boost Asio 缓冲区中的打包结构buffer_cast<T>)

这个网站上有很多例子(例如,Boost beast 将带有字节数组的 json 发送到客户端抛出 websocket,boost::asio::async_read_until 使用自定义match_char仅接受 JSON 格式Boost.beast:如何仅返回 json 响应,或用于序列化存档: C++ boost asio::带有 boost:asio::read 和 boost:: 的简单服务器/客户端:asio::write 传递 int 向量,在 boost::asio 等中发送/接收结构,一个带有虚拟类层次结构的漂亮演示 尝试使用 boost::serialization 通过 boos::asio 套接字发送派生类