How to use boost::tuple as attribute in a boost::spirit rule?
boost, boost-spirit, boost-spirit-qi, c++
Solution
In order for Spirit to recognize `boost::tuple<>` as a valid Fusion sequence, you need to include an additional header:
#include <boost/fusion/include/boost_tuple.hpp>
This is somewhat loosely hinted at in the docs here.
Problem
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` is not written into the tuple. Is there a way to make it work without having to use `boost::fusion::tuple`? It works if I use `std::pair`, so why can't I use `boost::tuple`? Here is a full compiling 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; } ```