我正在尝试编写一个小应用程序来处理网络数据包。为了方便测试,我希望这个应用程序可以在两种模式下运行:本地流模式(使用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();
最佳答案
两种可能性:
将流类型上的所有内容模板化。可能有点矫枉过正,但允许不完全遵守标准接口(interface)(通过特化)的流的灵 active 。不同的接口(interface)需要不同的特化,但高层接口(interface)(模板的调用)至少会统一。
确保您使用的所有流都继承自相同的基类(如果不是,请提供适配器类来解决接口(interface)差异),并使用它。我不确定引用是否适用于此处,您可能需要一个指针变量,如下所示:
std::istream *in = &get_event_stream();
然后让你的函数接受一个指向基类的指针(这里是 std::istream
),并且只使用基类拥有的函数:
void some_function( std::istream *in );
关于c++ - 如何编写通用函数来处理不同类型的流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9330500/