Reference Wrappers (ref)

We can directly extract the parser result and place that in a variable using this predefined semantic action functor. The class reference_ wrapper wraps a reference to a variable of type T. The reference_wrapper handles the semantic action construct:


where expr is an expression that evaluates to a parser and var is a variable that will hold the parsed result. A reference_wrapper object is not created directly. Instead, a reference_wrapper generator ref is responsible for its creation. The expression:


creates a reference_wrapper given a reference to a container. The reference_wrapper acts like a functor that is compatible with the semantic action that expects the interface:

void operator()(IteratorT begin, IteratorT end);

When this operator is invoked, the reference_wrapper expects that the referenced object is:

a container of some sort (e.g. std::string, std::vector)
that it may be constructed given two iterators
has a member function swap, that swaps the contents of two containers.

Here is an example that extracts the parsed result and puts it a string:

std::string s;          
r = (+anychar)[ref(s)];

// s will hold the parsed data
// if successful, rule r will write the 
// parsed result into the string s

The reference_wrapper also has an alternative functor interface:

void operator()(T val);

This alternate interface may be used by specialized actions. When this operator is invoked, the reference_wrapper merely expects that the referenced object be assignable (has an assignment operator). Here is an example that extracts complex numbers of the form r or (r) or (r, i):

double r = 0;
double i = 0;
rule<> complex_parser;

complex_parser = 
    |	    '('
        >>  real_p[ref(r)]
        >>  !(',' >> real_p[ref(i)])
        >>  ')';