c++ - 如何编写通用函数来处理不同类型的流?

标签 c++ boost-asio

我正在尝试编写一个小应用程序来处理网络数据包。为了方便测试,我希望这个应用程序可以在两种模式下运行:本地流模式(使用std::cin)和网络流模式(使用asio)-基于命令行是否提供端口例如号码。目标是使其对实际解析数据包的其余客户端类透明,例如,它们可以获取对流 event_stream 的引用,然后解析为:

event_stream >> MsgHeader;

假设类 MsgHeader 有一个重载运算符 >>。

对于本地流模式:我只是返回&cin。对于网络模式,我希望我可以做这样的事情:

boost::asio::io_service io_s;
tcp::acceptor acc(io_s. tcp::endpoint(tcp::v4(), 1950));
tcp::iostream stream;
acc.accept(*stream.rdbuf()); // act as server, another client will write to it.
return &stream;

但是我有点迷茫如何让其余的客户端“不知道”他们正在处理什么样的流?我可以像这样声明它吗:

std::istream &in = get_event_stream();

最佳答案

两种可能性:

  1. 将流类型上的所有内容模板化。可能有点矫枉过正,但允许不完全遵守标准接口(interface)(通过特化)的流的灵 active 。不同的接口(interface)需要不同的特化,但高层接口(interface)(模板的调用)至少会统一。

  2. 确保您使用的所有流都继承自相同的基类(如果不是,请提供适配器类来解决接口(interface)差异),并使用它。我不确定引用是否适用于此处,您可能需要一个指针变量,如下所示:

    std::istream *in = &get_event_stream();

然后让你的函数接受一个指向基类的指针(这里是 std::istream),并且只使用基类拥有的函数:

void some_function( std::istream *in );

关于c++ - 如何编写通用函数来处理不同类型的流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9330500/

相关文章:

c++ - boost::asio::async_receive 和套接字中的 0 个字节

c++ - 在启用基于它的构造函数时是否总是需要复制类模板参数?

c++ - 为什么代码没有cout?

c++ - 使用 asio 和 C++11 接受或接收时优雅地停止线程以进行阻塞或非阻塞

c++ - 为什么在asio的示例中,tcp接受器模式使用shared_pointer模型包装堆套接字,而udp使用堆栈套接字?

c++ - 与 asio::async_read 一起使用的正确模式是什么?

c++ - double 到 time 的转换

C++ setter 编码约定。输入变量名称应该是什么?

C++ 指针 : changing the contents without changing the address?

c++ - 当 asyn_read 可能在 boost.ASIO 中进行时销毁套接字对象是否安全?