2016-11-08 12 views
1

인용 부호가있는 경우 일부 입력을 long 또는 std::string으로 구문 분석하고 싶습니다. 이에 대한 합리적인 해결책은 x3::variant<long, std::string>을 사용하여 데이터를 저장하는 것입니다.부스트 스피릿 X3 : 데이터를 x3 :: variant로 추출하는 경우 <...>은 항상 비어 있습니다.

#include <iostream> 
#include <string> 

#include <boost/spirit/home/x3.hpp> 
#include <boost/spirit/home/x3/support/ast/variant.hpp> 

namespace x3 = boost::spirit::x3; 

const x3::rule<class number_tag, long> number = "number"; 
const auto number_def = x3::long_; 
BOOST_SPIRIT_DEFINE(number); 

const x3::rule<class string_tag, std::string> string = "string"; 
const auto string_def = x3::lexeme['"' >> *(x3::char_ - '"') >> '"']; 
BOOST_SPIRIT_DEFINE(string); 

using any_type = x3::variant<long, std::string>; 
const x3::rule<class any_tag, any_type> any = "any"; 
const auto any_def = number | string; 
BOOST_SPIRIT_DEFINE(any); 

int main() 
{ 
    const std::string src = "18"; 
    any_type result; 
    auto iter = src.begin(); 
    bool success = x3::phrase_parse(iter, src.end(), any, x3::space, result); 
    if (!success || iter != src.end()) 
     return 1; 
    else 
     std::cout << "Result: " << result << std::endl; 
} 

예상 결과는 다음과 같습니다 : 다음은 샘플 프로그램입니다 그러나

Result: 18 

은, 실제 결과는 단순히 : 내가 잘못 뭐하는 거지

Result: 

? 부스트 버전은 1.61입니다.

답변

1

그런 변형을 인쇄 할 수 없습니다. 방문자에게 전달해야합니다.

struct Visitor 
{ 
    using result_type = long; 

    result_type operator()(long v) const { return v; } 
    result_type operator() (const std::string& v) { return std::atol(v.c_str()); } 
}; 

과 같은 코드에서 호출해야합니다 : 예를 들어 (더 많은 오류가 변환에 이루어지지 확인)

if (!success || iter != src.end()) { 
     return 1; 
    } else { 
     Visitor v; 
     std::cout << "Result: " << boost::apply_visitor(v, result) << std::endl; 
    } 
+0

재미있는 ...'연산자 <<'일반'부스트에 : : variant '그냥 작동합니다. –