|
Boost Users : |
From: Joaquín Mª López Muñoz (joaquin_at_[hidden])
Date: 2006-11-30 04:29:25
Noah Roberts ha escrito:
[...]
> So in the end, my problem is thus:
>
> std::find_if(cont.begin(), cont.end(), bind(&deref_val_type::f, _1) == 5);
>
> How is that accomplished with lambda if cont holds smart pointers? So
> far I haven't found any way...
OK, you can write it with Boost Lambda as follows:
namespace l = boost::lambda;
std::find_if(
cont.begin(), cont.end(),
l::bind<int>(&*l::_1->*&deref_val_type::f)==5);
Boost.Bind is smarter here, since Boost Lambda needs assistance in:
1. Determining the return type of deref_val_type::f (hence the <int> in
l::bind<int>.)
2. Dereferencing the shared_ptr, hence the use of &*l::_1 to get a plain
pointer
from the shared_ptr, combined with ->* to call deref_val_type::f
Others might find terser ways to express this with Boost Lambda, but
looks like Boost.Bind is a clear winner here.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
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