2016-08-07 10 views
4

을 사용하여 두 개의 정수열을 std::pair<int, int>에 일치 시키려고합니다. 문서에 의해 판단, 다음 코드는 컴파일해야합니다두 개의 정수로 구성된 시퀀스를`std :: pair '에 매칭 <int, int>


#include <string> 
#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/home/x3.hpp> 

int main() 
{ 
    using namespace boost::spirit::x3; 

    std::string input("1 2"); 
    std::pair<int, int> result; 
    parse(input.begin(), input.end(), int_ >> int_, result); 
} 

melpon.org link


그러나, 그것은 첫 번째 정수를 일치합니다. std::pair<int, int> result;int result;으로 변경하고 result을 인쇄하면 1이 출력됩니다.

왜 그런 일이 발생합니까? int_ >> int_과 일치하는 구문 분석기를 정의하는 올바른 방법이 아니며 속성으로 설정합니다. 두 개의 정수가 필요합니까?

+5

'std :: pair'를 수정 한 Boost.Fusion 헤더를 포함시켜야 할 것 같습니다. –

+0

@ T.C .: 예, 문제가 해결되었습니다. 감사! 대답으로 의견을 게시하면 받아 들일 것입니다. –

답변

5

사실 @ T.C. <boost/fusion/adapted/std_pair.hpp>을 포함하는 것에 대한 의견은 문자열을 올바르게 구문 분석하지 않고 컴파일러를 조용히하기에 충분합니다. 또한 공백에 걸쳐 건너 뛰는 x3::phrase_parse()x3::parse()을 변경했다 : 나는 또한 네임 스페이스 별칭 로 using namespace boost::spirit::x3를 대체

#include <iostream> 
#include <string> 
#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/home/x3.hpp> 
#include <boost/fusion/adapted/std_pair.hpp> 

int main() 
{ 
    namespace x3 = boost::spirit::x3; 

    std::string input("1 2"); 
    std::pair<int, int> result; 
    auto ok = x3::phrase_parse(input.begin(), input.end(), x3::int_ >> x3::int_, x3::space, result); 
    std::cout << std::boolalpha << ok << ": "; 
    std::cout << result.first << ", " << result.second; 
} 

Live Example

참고. 이렇게하면 가독성을 유지할 수 있지만 엄청난 양의 Boost.Spirit 심볼을 코드에 버리지 않습니다.