【问题标题】:Using Boost::iostreams dual-use filters使用 Boost::iostreams 两用过滤器
【发布时间】:2015-03-08 22:25:32
【问题描述】:

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

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

typedef io::finite_state_filter my_fsm_filter;

我觉得仅将其推送到过滤流可能不合适,但我找不到缺少的步骤。我确信一定需要包装过滤器,但我找不到任何示例(尽管我确信如果我对用于测试 boost 代码的代码进行了足够深入的研究,它必须存在于某个地方)。

这里有一些示例代码:

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

【问题讨论】:

    标签: c++ boost boost-iostreams


    【解决方案1】:

    我个人觉得这个 imbue 调用的示例标头中存在错误。

    但是,您可以通过将 typedef 更改为来解决它

    struct my_fsm_filter : io::finite_state_filter<my_fsm> {
        using io::finite_state_filter<my_fsm>::imbue;
    };
    

    这将imbue 方法显式公开为派生类型上的公共。我没有查看您报告正在运行的示例程序(因为您没有链接到它)。但他们可能使用了类似的 hack。

    在我的测试中,添加了与finite_state_filte.hpp L278 类似的编辑

    using base_type::imbue;
    

    finite_state_filter类也有同样的效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-29
      • 2010-10-14
      • 2020-07-19
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多