【问题标题】:qi::parse boost change begin iteratorqi::parse boost 变化开始迭代器
【发布时间】:2017-07-02 02:13:39
【问题描述】:

下面的函数是否改变了第一个指向s.begin()然后指向s.begin() + 1的迭代器?我是对的?

#include <boost/spirit/include/qi.hpp>
#include <string>
#include <iostream>

using namespace boost::spirit;

int main()
{
    std::string s;
    std::getline(std::cin, s);
    auto it = s.begin();
    bool match = qi::parse(it, s.end(), ascii::digit);
    std::cout << std::boolalpha << match << '\n';
    if (it != s.end())
        std::cout << std::string{ it, s.end() } << '\n';
}

输入:

1卡尔

输出:

卡尔

【问题讨论】:

    标签: c++ boost boost-spirit-qi


    【解决方案1】:

    是的,如果解析器(下面的 expr 参数)成功,你是对的。这就是输入 1Kar 所发生的情况。您正在使用以下内容:

    //boost/spirit/home/qi/parse.hpp
    template <typename Iterator, typename Expr>
    inline bool
    parse(Iterator& first, Iterator last, Expr const& expr);
    

    参考:Iterator Based Parser API

    第一个迭代器由左值引用传递,在成功解析时,它被重新定位到解析器使用的最右边的位置。如果没有任何解析组件失败,则移动迭代器,例如:

    //Input: 1Kar
    qi::parse(it, s.end(), ascii::digit >> ascii::digit); //Fail
    assert(it == s.begin());
    
    //Input: 1Kar
    qi::parse(it, s.end(), ascii::digit); //Ok
    assert(it == std::next(s.begin()));
    

    【讨论】:

      猜你喜欢
      • 2021-09-09
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多