如何编写一个通用函数来处理不同类型的流

How to write a generic function to deal with different type of streams?

本文关键字:处理 函数 同类型 何编写 一个      更新时间:2023-10-16

我正在尝试编写一个小型应用程序来处理网络数据包。为了方便测试,我希望这个应用程序可以在两种模式下运行:本地流模式(使用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. 将流类型上的所有内容模板化。这可能有些过头了,但允许那些不完全遵循标准接口的流具有灵活性(通过专门化)。不同的接口需要不同的专业化,但高级接口(模板的调用)至少是统一的。

  2. 确保您使用的所有流都继承自同一个基类(如果不是,请提供适配器类来封装接口中的差异),并使用它。我不确定引用是否能在这里工作,你可能需要一个指针变量,比如:

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

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

void some_function( std::istream *in );