使用Boost :: iostreams两用过滤器

时间:2015-03-08 22:25:32

标签: c++ boost boost-iostreams

我试图在Boost :: iostreams文档中遵循有限状态过滤器的示例。但是,当我去使用过滤器时,我收到一条错误,指出:: imbue无法访问,因为' boost :: iostreams :: detail :: finite_state_filter_impl'使用' protected'继承自' my_fsm'。

感到沮丧,我将代码复制到了boost示例中的测试中。测试编译并通过。我的结论是,我可能误用了以下定义的双重用途过滤器:

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;
}

1 个答案:

答案 0 :(得分:1)

我个人觉得样本标题中有一个关于此imbue调用的错误。

但是,您可以通过将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具有相同的效果。