On Tue, Nov 29, 2011 at 1:30 PM, Daniel James <dnljms@gmail.com> wrote:
On 29 November 2011 13:09, Robert Jones <
robertgbjones@gmail.com> 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;
}