2017-07-02 5 views
0

以下の関数は、最初にs.begin()を指し、s.begin() + 1を指しているイテレータを変更しますか?私は正しい?qi :: parseブーストチェンジイテレータ

#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()));