我正在尝试编写一个小型应用程序来处理网络数据包。为了便于测试,我希望这个应用程序可以在两种模式下运行:本地流模式(使用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();
答案 0 :(得分:1)
两种可能性:
模拟流类型的所有内容。可能过度,但允许灵活的流不是所有符合标准接口(通过专业化)。不同的接口需要不同的专业化,但高级接口(模板的调用)至少是统一的。
确保您使用的所有流都继承自相同的基类(如果没有,请提供适配器类来包装接口中的差异),并使用它。我不确定引用是否适用于此,您可能需要一个指针变量,如下所示:
std :: istream * in =& get_event_stream();
然后让你的函数获取指向基类的指针(这里是std::istream
),并且只使用基类具有的函数:
void some_function( std::istream *in );