...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
This sample demonstrates a parser for a comma separated list of numbers. The numbers are inserted in a vector using phoenix.
template <typename Iterator> bool parse_numbers(Iterator first, Iterator last, std::vector<double>& v) { using qi::double_; using qi::phrase_parse; using qi::_1; using ascii::space; using phoenix::push_back; bool r = phrase_parse(first, last, // Begin grammar ( double_[push_back(phoenix::ref(v), _1)] >> *(',' >> double_[push_back(phoenix::ref(v), _1)]) ) , // End grammar space); if (first != last) // fail if we did not get a full match return false; return r; }
The full cpp file for this example can be found here: ../../example/qi/num_list2.cpp
This, again, is the same parser as before. This time, instead of summing
up the numbers, we stuff them in a std::vector
.
push_back
is supplied by
Boost.Phoenix.
The expression:
push_back(ref(v), _1)
appends the parsed number. Like before, _1
is a Boost.Phoenix
placeholder for the parsed result attribute. Also, like before, ref(v)
tells
Boost.Phoenix
that v
, the std::vector
, is a mutable reference.