支持 BOOST_FUSION_ADAPT_STRUCT 具有固定数组的对象?

Support BOOST_FUSION_ADAPT_STRUCT for objects with fixed arrays?

假设我已经有一个如下所示的结构:

struct LETTER
{
    double one;
    char[12] two;
    double three;
    char[12] four;
};

我的输入是逗号分隔的,例如:

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

我一直在尝试改编此示例 (Spirit Qi : rule for char [5]) to to roll through BOOST_FUSION_ADAPT_STRUCT but haven't had any luck. I tried using std::array as shown here (http://www.boost.org/doc/libs/1_64_0/libs/spirit/example/qi/boost_array.cpp),但我无法使其在结构中运行。我正在尝试做的事情有可能吗?我在这里做错了什么?我认为这将是最明显的用例。

我想做的事情是否可行?

我假设你想写地道的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'