首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写一个泛型函数来处理不同类型的流?

如何编写一个泛型函数来处理不同类型的流?
EN

Stack Overflow用户
提问于 2012-02-17 23:02:41
回答 1查看 93关注 0票数 1

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

代码语言:javascript
复制
event_stream >> MsgHeader;

假设类MsgHeader有一个重载操作符>>。

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

代码语言:javascript
复制
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;

但我有点迷失了,如何让客户端的其余部分“不知道”他们在处理什么类型的流?我可以这样声明它吗:

代码语言:javascript
复制
std::istream &in = get_event_stream();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-17 23:07:31

有两种可能性:

  1. 将流类型上的所有内容模板化。这可能有些夸大其词,但允许不完全遵循标准接口的流具有灵活性(通过专门化)。不同的接口需要不同的专门化,但高级接口(模板的调用)至少是统一的。
  2. 确保您使用的所有流都继承自同一基类(如果不是,则提供适配器类来封装接口的差异),并使用该基类。我不确定引用是否可以在这里工作,你可能需要一个指针变量来代替,如下所示:

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

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

代码语言:javascript
复制
void some_function( std::istream *in );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9330500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档