Custom Terminals

| Home | Libraries | People | FAQ | More

### 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;
        }
    };