如何编写一个通用函数来处理不同类型的流
How to write a generic function to deal with different type of streams?
我正在尝试编写一个小型应用程序来处理网络数据包。为了方便测试,我希望这个应用程序可以在两种模式下运行:本地流模式(使用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();
两种可能性:
-
将流类型上的所有内容模板化。这可能有些过头了,但允许那些不完全遵循标准接口的流具有灵活性(通过专门化)。不同的接口需要不同的专业化,但高级接口(模板的调用)至少是统一的。
-
确保您使用的所有流都继承自同一个基类(如果不是,请提供适配器类来封装接口中的差异),并使用它。我不确定引用是否能在这里工作,你可能需要一个指针变量,比如:
std::istream*in=&get_event_stream();
然后让你的函数取一个指向基类的指针(这里是std::istream
),并且只使用基类具有的函数:
void some_function( std::istream *in );
相关文章:
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 如何使用对C函数和类对象的外部调用来处理C++头文件
- std::string 构造函数如何处理固定大小的 char[]?
- 模板函数如何处理可能共享一个交集的多个类型名称?
- 如何编写具有相同名称的相同函数,该函数在C++中几乎以相似的方式处理不同的类参数?
- 为什么这个噪声函数不处理否定参数?
- 为什么 std::invoke 不处理函数重载
- 如何处理函数签名中间的参数包
- 当程序遇到故障时,如何在信号处理函数中写入日志和上传日志到MYSQL
- 处理函数和返回值问题的特殊学校代码
- C字符串处理函数获取子字符串
- 处理函数初始化的数组
- C++首先发生什么 - 破坏函数的参数或处理函数的返回值?
- 处理函数对象
- 如何在SWIG中处理函数模板
- c++中处理函数的动态调用
- 在处理函数的部分模板专门化时,类型定义和参数包展开问题
- 编译器如何处理函数函数中重载的函数调用操作符
- 使用clang API处理c++函数以插入代码
- ::std::remove_cv<>应该处理函数类型吗?