Boost logo

Boost Users :

Subject: Re: [Boost-users] proto: analytical-only math functions
From: Eric Niebler (eric_at_[hidden])
Date: 2009-02-03 12:45:46


Hi Hicham,

Hicham Mouline wrote:
> Hello,
>
> There are a few posts these days about generic libraries for math
> derivation of math functions, analytically or numerically.
>

<snip>

> template <size_t dim =1> struct function_tag {};

Use MPL Integral Constants here instead:

template<typename dim = mpl::size_t<1> >
struct function_tag {
    typedef dim dimension;
};

And define a dimension_of metafunction like this:

template<typename FunTag>
struct dimension_of {
   typedef typename FunTag::dimension type;
};

> I want to have 0 variables (nothing) for the 0-dim function in the
> proto::function case, and I want to have exactly dim variables in the dim>0 proto::function case.
>
> Is it possible to “math-define” the function at the same time of the
> function<> object definition (in c++ terms) and have the dimension
> deducted, like:
>
> function f(x,y,z) = x+y+z ;
>

Yes. Your LHS grammar should look something like this (untested):

struct lhs_grammar
   : proto::or_<
         // lone functions are ok
         proto::terminal< function_tag< mpl::size_t<0> > >
       , proto::and_<
             // f(x,y,z,...) is ok ...
             proto::function<
                 proto::terminal< function_tag< proto::_ > >
               , proto::vararg< proto::terminal< variable_tag > >
>
             // ... as long as the dimension of the function
             // matches the number of arguments.
           , proto::if_<
                 mpl::equal_to<
                     dimension_of< proto::_value(proto::_child0) >
                   , mpl::prior<proto::arity_of<proto::_> >
>()
>
>
>
{};

HTH,

-- 
Eric Niebler
BoostPro Computing
http://www.boostpro.com

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