提问人:Jésus Christophe 提问时间:10/21/2023 更新时间:10/21/2023 访问量:60
如何检索存储在缓冲区中的数据类型并将其传递给模板?
How to retrieve the data type stored in buffer and pass it to the template?
问:
我有一个问题,当我调用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 模块,但我没有按照我需要的方式工作。 所以我希望你能告诉我如何做到这一点,或者至少是解决问题的任何提示
答:
你总是必须知道类型。
你可以有一个类型列表(实际上通过某种(可移植的!)类型 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 套接字发送派生类
评论