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; }
Frank source share