Boost logo

Boost Users :

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


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.

Thx,

- Rob.

#include <map>
#include <vector>
#include <string>

#include <boost/bind.hpp>
#include <boost/range.hpp>

#include <boost/range/adaptor/transformed.hpp>
#include <boost/range/algorithm_ext/push_back.hpp>

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>

std::vector<int> ages_by_bind( const std::map<std::string, int> & people )
{
   using boost::adaptors::transformed;

   std::vector<int> result;

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

   return result;
}

std::vector<int> ages_by_lambda( const std::map<std::string, int> & people )
{
   using boost::adaptors::transformed;
   namespace ll = boost::lambda;

   std::vector<int> result;

   boost::range::push_back( result, people | transformed( ll::bind( &
std::map<std::string, int>::value_type::second, ll::_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