Boost logo

Boost Users :

Subject: Re: [Boost-users] [phoenix] v3 extension mechanism for template functions
From: alfC (alfredo.correa_at_[hidden])
Date: 2011-04-19 00:55:34


On Apr 18, 8:34 pm, alfC <alfredo.cor..._at_[hidden]> wrote:
> Hi,
>
>  In Phoenix2 I used to have the following code to add expressions of
> type pow<N>(... expr...) which where useful for expressions involving
> Boost.Units. Is it possible to do something similar with Phoenix3. The
> usage if macros in the tutorial examples obscures how to add template
> parameters to the phoenix expression. In Phoenix2 it was straight
> forward, but I can figure out how to do this in Phoenix3.

ok, this is the farthest I could go with Phoenix3. It seems that the
tag:: struct argument in phoenix::expr is a template template.

The following is the latest attempt, which doesn't compile, giving the
error:
boost/phoenix/core/is_nullary.hpp:124:9: error: base type ‘const
boost::proto::exprns_::basic_expr<boost::phoenix::tag::pow,
boost::proto::argsns_::list1<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tag::terminal,
boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l> > >,
1l>&’ fails to be a struct or class type

#include<boost/units/cmath.hpp>
namespace boost{
        namespace phoenix{
                namespace tag{
                        template<long N>
                        struct pow{};
                }

                namespace expression
                {
                    template <long N, typename A0>
                    struct pow
                        : boost::phoenix::expr<
                            tag::pow<N>
                          , A0
>
                        {};
                }
        }
        namespace phoenix_impl{
                template<long N>
                struct pow_impl{
                        template<class Sig> struct result;
                        template<class This, class Arg, class Cont>
                        struct result<This(Arg, Cont)>{
                                typedef double type; // just for testing
                        };
                        template<class Arg, class Cont>
                        typename result<pow_impl(Arg const&, Cont const&)>::type
                        operator()(Arg const& arg, Cont const& ctx) const {
                                return boost::units::pow<N>(eval(arg, ctx)).value(); //value, just
for testing
                        }
                };
        }
        namespace phoenix{
                template <long N, typename Arg>
                typename expression::pow<N, Arg>::type const
                pow(Arg const& arg){
                        return expression::pow<N, Arg>::make(arg);
                }
        }
}


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net