Mendukung BOOST_FUSION_ADAPT_STRUCT untuk objek dengan array tetap?

Asumsikan saya sudah memiliki struct yang terlihat seperti ini:

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

Dan masukan saya dipisahkan koma, misalnya:

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

Saya telah mencoba mengadaptasi contoh ini (Spirit Qi : rule for char [5]) untuk melewati BOOST_FUSION_ADAPT_STRUCT tetapi belum berhasil. Saya mencoba menggunakan std::array seperti yang ditunjukkan di sini (http://www.boost.org/doc/libs/1_64_0/libs/spirit/example/qi/boost_array.cpp) tetapi saya belum bisa membuatnya berfungsi di sebuah struct. Apakah yang saya coba lakukan mungkin? Apa yang saya lakukan salah di sini? Menurut saya ini akan menjadi kasus penggunaan yang paling jelas.

Apakah yang saya coba lakukan mungkin?


person Carbon    schedule 27.11.2017    source sumber
comment
Kasus penggunaan yang paling jelas menggunakan array char berukuran tetap? Itu paling jelas terlihat pada tahun 1970-an C. Cukup gunakan std::string jika Anda menginginkan kasus penggunaan yang jelas   -  person sehe    schedule 28.11.2017


Jawaban (1)


Saya berasumsi Anda ingin menulis kode C++ idiomatik (yang jelas merupakan domain target untuk Spirit Qi), sehingga Anda dapat menggunakan std::string:

Langsung di 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";
}

Cetakan

parsed: (42 12345678901 inf abcdefghijk)
 example.one: 42
 example.two: '12345678901'
 example.three: inf
 example.four: 'abcdefghijk'
person sehe    schedule 28.11.2017
comment
Oke keren, saya rasa saya akan meminta tim untuk berdamai dengan std::string untuk struktur data ini. - person Carbon; 28.11.2017