| /*============================================================================== |
| Copyright (c) 2005-2010 Joel de Guzman |
| Copyright (c) 2011 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) |
| ==============================================================================*/ |
| |
| #include <boost/phoenix/core.hpp> |
| |
| namespace phoenix = boost::phoenix; |
| namespace proto = boost::proto; |
| |
| |
| // define the expression |
| namespace expression |
| { |
| template <typename Lhs, typename Rhs> |
| struct plus |
| : phoenix::expr<proto::tag::plus, Lhs, Rhs> |
| {}; |
| } |
| |
| // extend the grammar, to recognice the expression |
| namespace boost { namespace phoenix { |
| |
| template <> |
| struct meta_grammar::case_<proto::tag::plus> |
| : enable_rule< |
| ::expression::plus< |
| meta_grammar |
| , meta_grammar |
| > |
| > |
| {}; |
| |
| }} |
| |
| // build a generator |
| template <typename Lhs, typename Rhs> |
| typename expression::plus<Lhs, Rhs>::type |
| plus(Lhs const & lhs, Rhs const & rhs) |
| { |
| return expression::plus<Lhs, Rhs>::make(lhs, rhs); |
| } |
| |
| #include <boost/proto/proto.hpp> |
| #include <iostream> |
| |
| int main() |
| { |
| |
| plus(6, 5); |
| |
| proto::display_expr(plus(6, 5)); |
| |
| std::cout << plus(5, 6)() << "\n"; |
| } |
| |
| |