1 | #define BOOST_SPIRIT_USE_PHOENIX_V3
|
---|
2 | #include <boost/optional.hpp>
|
---|
3 | #include <boost/variant.hpp>
|
---|
4 | #include <boost/spirit/include/qi.hpp>
|
---|
5 | #include <boost/spirit/include/phoenix.hpp>
|
---|
6 |
|
---|
7 | int main() {
|
---|
8 | namespace qi = boost::spirit::qi;
|
---|
9 | namespace phx = boost::phoenix;
|
---|
10 | using namespace boost::phoenix::arg_names;
|
---|
11 |
|
---|
12 | typedef char* Iter;
|
---|
13 |
|
---|
14 | //Doesn't compile
|
---|
15 | qi::rule<Iter, boost::optional<int>()> rule_a =
|
---|
16 | (-qi::int_)[
|
---|
17 | phx::if_(qi::_1)[
|
---|
18 | phx::nothing
|
---|
19 | ]
|
---|
20 | //Uncomment next line and it compiles
|
---|
21 | // , phx::nothing
|
---|
22 | ]
|
---|
23 | ;
|
---|
24 |
|
---|
25 | //Doesn't compile
|
---|
26 | qi::rule<Iter, boost::optional< boost::variant<int, double> >() > rule_b =
|
---|
27 | (qi::int_ | qi::double_ | qi::eps)[
|
---|
28 | phx::if_(qi::_1)[
|
---|
29 | phx::nothing
|
---|
30 | ]
|
---|
31 | //Uncomment next line and it compiles
|
---|
32 | // , phx::nothing
|
---|
33 | ]
|
---|
34 | ;
|
---|
35 |
|
---|
36 | //Compiles
|
---|
37 | qi::rule<Iter, boost::optional< boost::variant<int, double> >() > rule_c =
|
---|
38 | (qi::int_ | qi::double_ | qi::eps)[
|
---|
39 | phx::if_(phx::val(true))[
|
---|
40 | phx::nothing
|
---|
41 | ]
|
---|
42 | ]
|
---|
43 | ;
|
---|
44 |
|
---|
45 | //Compiles
|
---|
46 | qi::rule<Iter, boost::optional<int>()> rule_d =
|
---|
47 | (-qi::int_)[
|
---|
48 | std::cout << qi::_1
|
---|
49 | ]
|
---|
50 | ;
|
---|
51 |
|
---|
52 | //Compiles
|
---|
53 | phx::if_(arg1)[
|
---|
54 | phx::nothing
|
---|
55 | ]
|
---|
56 | (boost::optional<int>(5));
|
---|
57 |
|
---|
58 | return 0;
|
---|
59 | }
|
---|