| [/============================================================================== |
| Copyright (C) 2001-2010 Joel de Guzman |
| Copyright (C) 2001-2005 Dan Marsden |
| Copyright (C) 2001-2010 Thomas Heller |
| |
| Distributed under the Boost Software License, Version 1.0. (See accompanying |
| file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| ===============================================================================/] |
| |
| [section 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; |
| } |
| }; |
| |
| [endsect] |
| |