Boost logo

Boost Users :

Subject: Re: [Boost-users] [phoenix] - std::for_each - How to call member variable that is a boost::function?
From: Jeffrey Lee Hellrung, Jr. (jeffrey.hellrung_at_[hidden])
Date: 2013-04-30 13:20:19


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 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