2017-11-27 19 views
1

은 이미 다음과 같습니다 구조체가 있다고 가정 나는이 예 (Spirit Qi : rule for char [5])에 적응하기 위해 노력했습니다고정 배열이있는 객체의 경우 BOOST_FUSION_ADAPT_STRUCT를 지원합니까? 예를 들어, 쉼표로 구분되어</p> <pre><code>struct LETTER { double one; char[12] two; double three; char[12] four; }; </code></pre> <p>그리고 내 입력 :

"32,CATSANDDOGS,42,WHAT" 
"43,BATANDZEBRAS,23,PARROT" 

BOOST_FUSION_ADAPT_STRUCT을 통해 굴러 갔지만 운이 없었습니다. 여기에 표시된대로 std::array (http://www.boost.org/doc/libs/1_64_0/libs/spirit/example/qi/boost_array.cpp)을 사용하여 시도했지만 struct에서 작동하도록 만들지 못했습니다. 내가 할 수있는 일이 가능한거야? 여기서 내가 뭘 잘못하고 있니? 나는 이것이 가장 명백한 유스 케이스라고 생각할 것이다.

내가 할 수있는 일이 가능한 것일까 요?

+0

가장 확실한 사용 사례는 고정 크기 문자 배열? 명백한 유스 케이스를 따라 간다면'std :: string'을 사용하십시오. – sehe

답변

1

당신이 사용할 수 있도록 내가, 당신이 (분명히 성령 제나라의 대상 도메인입니다) 관용적 C++ 코드를 작성한다고 가정하겠습니다 std::string :

Live On Coliru

#include <boost/fusion/adapted.hpp> 
#include <boost/fusion/include/io.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <iostream> 

namespace qi = boost::spirit::qi; 

struct Letter { 
    double one; 
    std::string two; 
    double three; 
    std::string four; 
}; 

BOOST_FUSION_ADAPT_STRUCT(Letter, one, two, three, four) 

template <typename Iterator> struct LETTERParser : qi::grammar<Iterator, Letter()> { 
    LETTERParser() : LETTERParser::base_type(start) { 
     using namespace qi; 

     _11c = repeat(11) [char_]; 
     start = skip(space) [ "LETTER" >> double_ >> _11c >> double_ >> _11c ]; 
    } 
    private: 
    qi::rule<Iterator, Letter()> start; 
    qi::rule<Iterator, std::string()> _11c; 
}; 

int main() { 
    const std::string input("LETTER 42 12345678901 +Inf abcdefghijk "); 
    using It = std::string::const_iterator; 

    LETTERParser<It> parser; 
    Letter example; 

    It f = input.begin(), l = input.end(); 

    if (phrase_parse(f, l, parser, qi::ascii::space, example)) { 
     std::cout << "parsed: " << boost::fusion::as_vector(example) << "\n"; 
     std::cout << " example.one: " << example.one << "\n"; 
     std::cout << " example.two: '" << example.two << "'\n"; 
     std::cout << " example.three: " << example.three << "\n"; 
     std::cout << " example.four: '" << example.four << "'\n"; 
    } else { 
     std::cout << "couldn't parse '" << input << "'\n"; 
    } 

    if (f != l) 
     std::cout << "Remaining unparsed input: '" << std::string(f,l) << "'\n"; 
} 

인쇄물

parsed: (42 12345678901 inf abcdefghijk) 
example.one: 42 
example.two: '12345678901' 
example.three: inf 
example.four: 'abcdefghijk' 
+0

괜찮습니다.이 데이터 구조에 대해'std :: string'을 사용하여 팀을 평화롭게 만들 수있을 것 같군요. – Carbon