123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- [/==============================================================================
- 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 Porting from Phoenix 2.0]
- While reading the current documentation you might have noticed that the
- [link phoenix.starter_kit Starter Kit] didn't change very much. This is because
- a lot of effort was put into being compatible with Phoenix 2.0, at least on the
- outside.
- That being said, the only major difference is the result type deduction protocol.
- The everyday Phoenix-User will encounter this change only when writing
- [link phoenix.reference.modules.function Functions].
- To make your function implementations Phoenix compliant again change from
- the old Phoenix result type deduction protocol to the new (standard compliant)
- result type deduction protocol:
- [table
- [[Phoenix 2.0] [Phoenix 3.0] [Notes]]
- [
- [``
- struct is_odd_impl
- {
- template <typename Arg>
- struct result
- {
- typedef bool type;
- };
- template <typename Arg>
- bool operator()(Arg arg) const
- {
- return arg % 2 == 1;
- }
- };
-
- boost::phoenix::function<is_odd_impl> is_odd = is_odd_impl();
- ``]
- [``
- struct is_odd_impl
- {
- typedef bool result_type;
- template <typename Arg>
- bool operator()(Arg arg) const
- {
- return arg % 2 == 1;
- }
- };
-
- boost::phoenix::function<is_odd_impl> is_odd = is_odd_impl();
- ``]
- [ __note__
- The result_of protocol is particularly easy when you implement a monomorphic
- function (return type not dependent on the arguments). You then just need a
- single nested return_type typedef.
- ]
- ]
- [
- [``
- struct add_impl
- {
- template <typename Arg1, typename Arg2>
- struct result
- {
- typedef Arg1 type;
- };
- template <typename Arg1, typename Arg2>
- Arg1 operator()(Arg1 arg1, Arg2 arg2) const
- {
- return arg1 + arg2;
- }
- };
-
- boost::phoenix::function<add_impl> add = add_impl();
- ``]
- [``
- struct add_impl
- {
- template <typename Sig>
- struct result;
- template <typename This, typename Arg1, typename Arg2>
- struct result<This(Arg1, Arg2)>
- : boost::remove_reference<Arg1> {};
- template <typename Arg1, typename Arg2>
- typename boost::remove_reference<Arg1>::type
- operator()(Arg1 arg1, Arg2 arg2) const
- {
- return arg1 + arg2;
- }
- };
-
- boost::phoenix::function<add_impl> add = add_impl();
- ``]
- [__alert__ When dealing with polymorphic functions the template arguments can
- be any type including cv-qualifiers and references. For that reason, the calculated
- result type need to remove the reference whenever appropriate!]
- ]
- ]
- [blurb __tip__ There is no general guideline for porting code which relies on the
- internals of Phoenix 2.0. If you plan on porting your Phoenix 2.0 extensions
- please refer to the next sections.]
- [endsect]
|