12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- [/==============================================================================
- 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]
|