Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Custom Terminals

Custom Terminals are used in Phoenix to handle special values transparently. For example, as Phoenix captures everything by value, we needed to use boost::reference_wrapper to bring reference semantics into Phoenix.

Custom terminals could be any wrapper class:

template <typename T>
struct is_custom_terminal;

needs to be specialized in order for Phoenix to recognize this wrapper type. default_action calls custom_terminal<T>.

Example:

// Call out boost::reference_wrapper for special handling
template<typename T>
struct is_custom_terminal<boost::reference_wrapper<T> >
  : mpl::true_
{};

// Special handling for boost::reference_wrapper
template<typename T>
struct custom_terminal<boost::reference_wrapper<T> >
{
    typedef T &result_type;

    template <typename Context>
    T &operator()(boost::reference_wrapper<T> r, Context &) const
    {
        return r;
    }
};

PrevUpHomeNext