Boost logo

Boost Users :

Subject: Re: [Boost-users] [lambda & range] bind for transformed - how to do it.
From: Robert Jones (robertgbjones_at_[hidden])
Date: 2011-11-29 08:57:04


On Tue, Nov 29, 2011 at 1:30 PM, Daniel James <dnljms_at_[hidden]> wrote:

> On 29 November 2011 13:09, Robert Jones <robertgbjones_at_[hidden]> wrote:
> > In this code (fabricated) sequence, ages_by_bind compiles, but
> > ages_by_lambda
> > does not.
> >
> > I believe this is because the lambda version does not publish
> result_type to
> > its
> > resultant functors, since the increased generality of lambda makes this
> > difficult
> > or impossible to do.
> >
> > Is there any way I can get round this, as it currently makes the
> > lambda/transformed
> > combination completely unusable AFAICS.
>
> Have you tried using Phoenix? It has better support for result_type.
>

I have now, precisely because I'd understood it had better support as you
said. Like this,
perhaps someone could tell me if this is fine on 1.44/1.47 too!

Thx,

- Rob.

#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/home/phoenix/bind.hpp>
#include <boost/spirit/home/phoenix/core/argument.hpp>

std::vector<int> ages_by_phoenix( const std::map<std::string, int> & people
)
{
    namespace ph = boost::phoenix;
    namespace arg = boost::phoenix::arg_names;
    using boost::adaptors::transformed;

    std::vector<int> result;

    boost::range::push_back( result, people | transformed( ph::bind( &
std::map<std::string, int>::value_type::second, arg::_1 ) ) );

    return result;
}



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