|
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