2017-07-02 66 views
0

做下面的函數改變迭代器,它首先指向s.begin(),並且指向s.begin() + 1?我是對的?qi ::解析升壓改變開始迭代器

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

INPUT:

1Kar

OUTPUT:

回答

2

是的,如果解析器(下面的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()));