Boost logo

Boost Users :

Subject: Re: [Boost-users] [Proto] callable_context
From: Hossein Haeri (powerprogman_at_[hidden])
Date: 2011-01-05 14:52:54


Just wanted to say that I solved the problem by delegating the task of evaluation to a dummy call forwarder:

struct FuncStreamCtx: callable_context<const FuncStreamCtx, null_context>
{
        FuncStreamCtx() {}

        typedef double result_type;

        double operator () (tag::terminal, double i) const {return i;}

        template<typename L, typename R>
        double operator () (tag::shift_right, const L& l, const R& r) const
        {
                double arg = evaluate_helper(l, *this);
                double (*f) (double) = value(r);
                return f(arg);
        }
};

template<typename Expr>
double evaluate_helper(const Expr& e, const FuncStreamCtx& ctx)
{
        return boost::proto::eval(e, ctx);
}

template<typename Expr>
double evaluate(const Expr& e)
{
        const FuncStreamCtx ctx;
        return evaluate_helper(e, ctx);
}

--- On Wed, 5/1/11, Hossein Haeri <powerprogman_at_[hidden]> wrote:

> From: Hossein Haeri <powerprogman_at_[hidden]>
> Subject: Re: [Boost-users] [Proto] callable_context
> To: boost-users_at_[hidden]
> Date: Wednesday, 5 January, 2011, 15:31
> Dear Erik,
>
> > > lit(1) >> &f >> &g >>
> &h
> > >
> > > So, what about this new one in Proto?
> >
> > Yes, that should be doable.
>
> OK, that's good news. Here is my attempt to get it done
> (assuming that we only pipe integers into series of
> functions):
>
> struct FuncStreamCtx: callable_context<const
> FuncStreamCtx>
> {
>     FuncStreamCtx() {}
>
>     typedef int result_type;
>
>     int operator () (tag::terminal, int i)
> const {return i;}
>
>     template<typename L, typename R>
>     int operator () (tag::shift_right, const
> L& l, const R& r) const
>     {
>         int arg = eval<L,
> const FuncStreamCtx>(l, *this);//***
>         int (*f) (int) =
> value(r);
>         return f(arg);
>     }
> };
>
> (I know you told me that contexts make life hard. But, I'm
> not still comfortable with transforms...)
>
> Now, when I try to compile this code (GCC 4.5.1, MinGW32,
> WinXP, SP3), I get the error in the P.S. for trying it
> with:
>
> cout << eval(lit(51) >> &plus2, ctx);
>
> >From what I understand, from line ***, GCC mistakenly
> thinks that I'm trying to instantiate eval<> and fails
> to find an appropriate ctor -- it only nags about finding
> the default and the copy one. Strangely enough, when I
> remove the template arguments from the same line, I get:
>
> error: missing template arguments before '(' token
>
> Any ideas?
>
> TIA,
> --Hossein
>
> P.S.
>
>
> -------------- Build: Debug in ProtoGame3 ---------------
>
> Compiling: main.cpp
> D:\My Documents\My
> Programmes\Tutorial\Proto\ProtoGame3\main.cpp: In member
> function 'int
> FuncStreamCtx::operator()(boost::proto::tag::shift_right,
> const L&, const R&) const [with L =
> boost::proto::utility::literal<const int&,
> boost::proto::domainns_::default_domain>, R =
> boost::proto::exprns_::expr<boost::proto::tag::terminal,
> boost::proto::argsns_::term<int (* const&)(int)>,
> 0l>]':
> D:\Sources\Boost\boost_1_42_0/boost/proto/context/callable.hpp:313:21:   instantiated
> from 'boost::proto::context::callable_eval<Expr, Context,
> 2l>::result_type
> boost::proto::context::callable_eval<Expr, Context,
> 2l>::operator()(Expr&, Context&) const [with Expr
> = const
> boost::proto::exprns_::expr<boost::proto::tag::shift_right,
> boost::proto::argsns_::list2<const
> boost::proto::utility::literal<const int&,
> boost::proto::domainns_::default_domain>&,
> boost::proto::exprns_::expr<boost::proto::tag::terminal,
> boost::proto::argsns_::term<int (* const&)(int)>,
> 0l> >, 2l>, Context = const FuncStreamCtx,
> boost::proto::context::callable_eval<Expr, Context,
> 2l>::result_type = int]'
> D:\Sources\Boost\boost_1_42_0/boost/proto/eval.hpp:100:62:   instantiated
> from 'typename boost::proto::result_of::eval<Expr,
> Context>::type boost::proto::eval(Expr&, const
> Context&) [with Expr = const
> boost::proto::exprns_::expr<boost::proto::tag::shift_right,
> boost::proto::argsns_::list2<const
> boost::proto::utility::literal<const int&,
> boost::proto::domainns_::default_domain>&,
> boost::proto::exprns_::expr<boost::proto::tag::terminal,
> boost::proto::argsns_::term<int (* const&)(int)>,
> 0l> >, 2l>, Context = FuncStreamCtx, typename
> boost::proto::result_of::eval<Expr, Context>::type =
> int]'
> D:\My Documents\My
> Programmes\Tutorial\Proto\ProtoGame3\main.cpp:38:37:   instantiated
> from here
> D:\My Documents\My
> Programmes\Tutorial\Proto\ProtoGame3\main.cpp:23:50: error:
> no matching function for call to
> 'boost::proto::context::callable_context<const
> FuncStreamCtx>::eval<boost::proto::utility::literal<const
> int&, boost::proto::domainns_::default_domain>
> >::eval(const boost::proto::utility::literal<const
> int&, boost::proto::domainns_::default_domain>&,
> const FuncStreamCtx&)'
> D:\Sources\Boost\boost_1_42_0/boost/proto/context/callable.hpp:223:17:
> note: candidates are:
> boost::proto::context::callable_context<const
> FuncStreamCtx>::eval<boost::proto::utility::literal<const
> int&, boost::proto::domainns_::default_domain>
> >::eval()
> D:\Sources\Boost\boost_1_42_0/boost/proto/context/callable.hpp:223:17:
> note:             
>    boost::proto::context::callable_context<const
> FuncStreamCtx>::eval<boost::proto::utility::literal<const
> int&, boost::proto::domainns_::default_domain>
> >::eval(const
> boost::proto::context::callable_context<const
> FuncStreamCtx>::eval<boost::proto::utility::literal<const
> int&, boost::proto::domainns_::default_domain>
> >&)
> Process terminated with status 1 (0 minutes, 19 seconds)
> 3 errors, 0 warnings
>
>
>
>
>      
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>


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