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

时间:2012-02-17 15:02:41

标签: 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 个答案:

答案 0 :(得分:1)

两种可能性:

  1. 模拟流类型的所有内容。可能过度,但允许灵活的流不是所有符合标准接口(通过专业化)。不同的接口需要不同的专业化,但高级接口(模板的调用)至少是统一的。

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

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

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

    void some_function( std::istream *in );