123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- /*==============================================================================
- 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";
- }
|