使用 Boost::iostreams 两用过滤器
Using Boost::iostreams dual-use filters
我试图遵循Boost::iostreams文档中的有限状态过滤器的例子。但是,当我使用过滤器时,我收到一个错误,指出无法访问::imbue,因为"boost::iostreams::d etail::finite_state_filter_impl"使用"受保护"从"my_fsm"继承。
沮丧的我把我的代码复制到了提升示例中的测试中。测试编译并通过。我的结论是,我可能误用了由以下人员定义的两用过滤器:
typedef io::finite_state_filter my_fsm_filter;
我觉得仅仅把它推到filtered_stream上可能不合适,但我找不到缺少的步骤。我确信一定需要包装过滤器,但我找不到任何示例(尽管我确信如果我深入研究了用于测试提升代码的代码,它必须存在于某个地方)。
下面是一些示例代码:
#include <boost/mpl/vector.hpp>
#include <libs/iostreams/example/finite_state_filter.hpp>
namespace io = boost::iostreams;
struct my_fsm : io::finite_state_machine<my_fsm> {
BOOST_IOSTREAMS_FSM(my_fsm) // define skip and push.
typedef my_fsm self;
static const int beginline = 0;
static const int skipline = 1;
static const int dataline = 2;
typedef boost::mpl::vector <
row<beginline, is<'C'>, skipline, &self::skip>,
row<beginline, is_any, dataline, &self::push>,
row<skipline, is<'n'>, beginline, &self::skip>,
row<skipline, is_any, skipline, &self::skip>,
row<dataline, is<'n'>, beginline, &self::push>,
row<dataline, is_any, dataline, &self::push>
> transition_table;
};
typedef io::finite_state_filter<my_fsm> my_fsm_filter;
#include <iostream>
#include <string>
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/stream.hpp>
namespace io = boost::iostreams;
int main() {
io::stream<io::file_sink> out(io::file_sink("outputfile.txt"));
io::filtering_istream in;
my_fsm_filter infsm;
in.push(my_fsm_filter());
in.push(io::file_source("inputdata.txt"));
while (in) {
std::string line;
if(std::getline(in, line)) {
//std::cout << line << std::endl;
out << line << std::endl;
}
}
return 0;
}
我个人觉得关于这个灌输调用的示例标头中存在错误。
但是,您可以通过将 typedef 更改为
struct my_fsm_filter : io::finite_state_filter<my_fsm> {
using io::finite_state_filter<my_fsm>::imbue;
};
这会在派生类型上显式公开 imbue
方法作为公共方法。我没有看过您报告正在运行的示例程序(因为您没有链接到它)。但他们可能使用了类似的黑客。
在我的测试中,与finite_state_filte.hpp
L278 类似的编辑要添加
using base_type::imbue;
对类finite_state_filter
具有相同的效果。
相关文章:
- 带过滤器的现代迭代c++集合
- 如何将字符串添加到布谷鸟过滤器?
- 隐式声明的 boost::iostreams::mapped_file_source 已被弃用
- 在事件过滤器之前发出对象的事件
- C++对开销较少的容器使用多个过滤器
- CBasePin 递增对拥有过滤器的引用.循环引用?
- Qt:事件过滤器在显示 QCompleter 时不接收按键
- 使用 Vivek 的 Vcam / 捕获源过滤器构建/链接错误
- Qt 中的去抖动事件过滤器
- QT 事件过滤器 mouseEvent->pos().x() 始终为零,但 mouseEvent->pos().y() 工作正常
- 如何使用C++获取/设置OBS中的垂直滚动过滤器属性?
- ZeroMQ (cppzmq) 订阅者,过滤器以相同的字符串开头
- 有没有办法查询邮件过滤器是否已经生效?
- 使用指针使用过滤器重写字符数组
- 使用 BOOST property_tree / iostreams / 文件系统 / foreach - 结果出现链接
- 如何优化此侵蚀过滤器代码?
- 使用运算符<<与增强 iostreams 压缩过滤器
- 使用 Boost::iostreams 两用过滤器
- 如何在通过过滤器链读取时禁用boost::iostreams缓冲区
- 如何使用压缩器Boost::Iostreams过滤器作为Boost::Log中的sink