Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Number List - stuffing numbers into a std::vector

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.


PrevUpHomeNext