Boost logo

Boost Users :

Subject: Re: [Boost-users] [fusion] proposal BOOST_FUSION_ADAPT_FUNCTION, BOOST_FUSION_DEFINE_FUNCTION, etc
From: alfC (alfredo.correa_at_[hidden])
Date: 2010-10-15 02:00:49


On Oct 14, 10:45 pm, OvermindDL1 <overmind..._at_[hidden]> wrote:
> On Thu, Oct 14, 2010 at 11:41 PM, alfC <alfredo.cor..._at_[hidden]> wrote:
>
> > On Oct 14, 10:30 pm, OvermindDL1 <overmind..._at_[hidden]> wrote:
> >> On Thu, Oct 14, 2010 at 11:09 PM, alfC <alfredo.cor..._at_[hidden]> wrote:
> >> > Hi,
>
> >> >  I am using Boost.Fusion lately. Sometimes one has a function with
> >> > several parameters,
>
> >> > int f(double d , int i , std::string s){
> >> >  ...bla bla ...
> >> > }
>
> >> > the logic of the program says that sometimes that same funcion will be
> >> > called by generic code and in such case it is better if "f" where
> >> > defined as taking a fusion::vector as argument.
>
> >> > int f(fusion::vector<double, int, std::string>) // another function,
> >> > could be an overload even
>
> >> > since there is only one why to define this adaptor function, e.g.
> >> > int f(fusion::vector<double, int, std::string> x){
> >> >  return f(at_c<0>(x), at_c<1>(x), at_c<2>(x));\
> >> > }
>
> >> > and it is pretty mechanical. I was wondering if it would be a good
> >> > idea to have, with consistency with the  BOOST_FUSION_ADAPT_STRUCT,
> >> > something called BOOST_FUSION_ADAPT_FUNCTION
>
> >> > BOOST_FUSION_ADAPT_FUNCTION(
> >> >    int, f,
> >> >    double,
> >> >    int,
> >> >    std::string
> >> > )
> >> > (or something like that)
> >> > that defines the second / fusion-compatible version of f.
>
> >> > It could be even a
>
> >> > BOOST_FUSION_DEFINE_FUNCTION(
> >> >    int, f,
> >> >    (double, d),
> >> >    (int, i),
> >> >    (std::string, s),
> >> >    ( ... code using variables d, i, s or at_key<d_>, at_key<i_>,
> >> > at_key<s_> ...  )
> >> > )
>
> >> > that defines simultaneously the raw-C function, f(double, int, string)
> >> > *and* the fusion friendly version f(vector<...>).
> >> > I could probably program these macro for specific cases but not a
> >> > general one since I don't know enough macro syntax to make it work.
>
> >> > Do you think it is a good idea or it is already doable with existing
> >> > Fusion features?
>
> >> It should already be doable, given example:
> >>   // include fusion here
>
> >>   int f(double d , int i , std::string s){
> >>     ...bla bla ...
> >>   }
>
> >>   int main(void) {
> >>     boost::fusion::vector<double,int,std::string myVec(3.14, 42,
> >> "Hello World!");
> >>     return boost::fusion::invoke(&f, myVec);
> >>   }
>
> > cool.
> > one question:  does it work for member functions as well?
>
> It works for any thing that fulfills the Boost.Fusion callable concept
> as outlined here:
>  http://www.boost.org/doc/libs/1_44_0/libs/fusion/doc/html/fusion/func...
>
> So yes, it works for member functions (where the class instance it is
> called from is the ***first entry in the fusion vector/list/whatever).****

that "first entry" feature is an annoyance for my application.

I have mostly function objects

class f_impl{
  double operator()( double, int, string ...);
}

f_impl f;

for which I would like to have a systematic way of
using it as

f( vector<double, int, string, ... > )

without having to add the f_impl at the beginning of the
fusion::vector

Thank you,

> _______________________________________________
> Boost-users mailing list
> Boost-us..._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