Boost logo

Boost Users :

Subject: Re: [Boost-users] [phoenix] - std::for_each - How to call member variable that is a boost::function?
From: Aaron_Wright_at_[hidden]
Date: 2013-04-30 16:25:26


"It's non-obvious where another wrapping bind should go and why it works"

I just did it like so:

std::for_each(
      foos.begin(),
      foos.end(),
     bp::bind(bp::bind(&Foo::callback, bpa::arg1)));

But this seems silly as I'm not binding anything in the outer bind.

---
Aaron Wright
From:   "Jeffrey Lee Hellrung, Jr." <jeffrey.hellrung_at_[hidden]>
To:     boost-users_at_[hidden]
Date:   04/30/2013 10:21 AM
Subject:        Re: [Boost-users] [phoenix] - std::for_each - How to call 
member variable that is a boost::function?
Sent by:        "Boost-users" <boost-users-bounces_at_[hidden]>
On Tue, Apr 30, 2013 at 9:00 AM, <Aaron_Wright_at_[hidden]> wrote:
I'm a little confused on the correct way to lazily call a boost::function
in a phoenix expression. For example, this doesn't do anything:
namespace bp = boost::phoenix;
namespace bpa = bp::arg_names;
struct Foo
{
   boost::function< void() > callback;
   Foo(boost::function< void() > const& callback) :
      callback(callback)
   {
   }
};
main()
{
   std::list< Foo > foos;
   foos.push_back(Foo(std::cout << bp::val(1) << '\n'));
   foos.push_back(Foo(std::cout << bp::val(2) << '\n'));
   foos.push_back(Foo(std::cout << bp::val(3) << '\n'));
   std::for_each(
      foos.begin(),
      foos.end(),
     bp::bind(&Foo::callback, bpa::arg1));
}
If I wrap the bind(...) in another bind(...) it'll work, but is that the
right way? I'm not binding anything, I just want the callback called.
Well, excusing my indexing into a std::list for the moment,
bp::bind(&Foo::callback, bpa::arg1)(foos[0])
just evaluates to foos[0].callback, i.e., it accesses the callback member, 
but doesn't do anything with it.
The part I'm not sure about offhand is what the best way would be to then 
invoke that member with empty parentheses. It's non-obvious where another 
wrapping bind should go and why it works :( I would've coded or dug up 
some apply function object that evaluates its argument and utilized that
struct apply { template< class T > void operator()(T f) { f(); } };
but there's probably a better way.
- Jeff
_______________________________________________
Boost-users mailing list
Boost-users_at_[hidden]
http://lists.boost.org/mailman/listinfo.cgi/boost-users

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