Hi!
I would like to write code like
int main()
{
namespace l = boost::lambda;
std::map M;
M[1] = 5.0;
M[3] = 7.0;
std::for_each(M.begin(), M.end(),
l::select2nd(l::_1) *= 6.0);
}
Is it hard to implement this for boost::lambda?
Markus
Accessing data members can be done, but it's unfortunately a bit more
complicated than:
_1.second
I just wish . could be overloaded.
Example code below.
Cheers, Jaakko
--------------------
#include "boost/lambda/lambda.hpp"
#include "boost/lambda/bind.hpp"
#include <algorithm>
#include <map>
#include <iostream>
// A function object class that takes returns a second argument of a pair.
// This can be used with bind.
struct select2nd {
// Tell LL how to get the return type. Args will be tuple >,
// so get the element at index 1.
template <class Args>
struct sig {
typedef typename
boost::tuples::element<1, Args>::type pair_t;
typedef typename boost::add_reference<typename pair_t::second_type>::type type;
};
template <class T>
typename boost::add_reference<typename T::second_type>::type
operator()(T& t) const { return t.second; }
};
int main()
{
namespace l = boost::lambda;
std::map M;
M[1] = 5.0;
M[3] = 7.0;
std::for_each(M.begin(), M.end(), std::cout << l::bind(select2nd(), l::_1) << " ");
std::cout << std::endl;
std::for_each(M.begin(), M.end(), l::bind(select2nd(), l::_1) *= 6.0);
std::for_each(M.begin(), M.end(), std::cout << l::bind(select2nd(), l::_1) << " ");
std::cout << std::endl;
// alternatively, use bind to refer directly to the data member. You need to
// spell out the full type of the pair though.
std::for_each(M.begin(), M.end(),
l::bind(&std::map::value_type::second, l::_1) *= 6.0);
std::for_each(M.begin(), M.end(), std::cout << l::bind(select2nd(), l::_1) << " ");
std::cout << std::endl;
}
-------------------