How to use boost :: tuple as an attribute in a boost :: spirit rule?

I have the following rule in boost::spirit :

 typedef boost::tuple<int, int> Entry; qi::rule<Iterator, Entry(), Skipper> entry; entry = qi::int_ >> qi::int_; 

But the second int not written to the tuple. Is there a way to make it work without using boost::fusion::tuple ?

It works if I use std::pair , so why can't I use boost::tuple ?

Here is a complete compilation example:

 #include <iostream> #include <boost/spirit/include/qi.hpp> #include <boost/fusion/include/tuple.hpp> #include <boost/tuple/tuple.hpp> namespace qi = boost::spirit::qi; // works: // #include <boost/fusion/include/std_pair.hpp> // typedef std::pair<int, int> Entry; // doesn't work: typedef boost::tuple<int, int> Entry; template <typename Iterator, typename Skipper> struct MyGrammar : qi::grammar<Iterator, Entry(), Skipper> { MyGrammar() : MyGrammar::base_type(entry) { entry = qi::int_ >> qi::int_; } qi::rule<Iterator, Entry(), Skipper> entry; }; int main() { const std::string in = "1 3"; typedef std::string::const_iterator It; It it = in.begin(); Entry entry; MyGrammar<It, qi::space_type> gr; if (qi::phrase_parse(it, in.end(), gr, qi::space, entry) && it == in.end()) { std::cout << boost::get<0>(entry) << "," << boost::get<1>(entry) << std::endl; } return 0; } 
+4
source share
1 answer

In order for Spirit to recognize boost::tuple<> as a valid Fusion sequence, you need to add an additional header:

 #include <boost/fusion/include/boost_tuple.hpp> 

This is somewhat loosely outlined in the docs here .

+8
source

Source: https://habr.com/ru/post/1413613/


All Articles