Martin Wille wrote:
> Aleksey Gurtovoy wrote:
> ...
>  >         widget w2;
> >         w.enable(boost::bind(&widget::is_enabled, &w2)); // here!
> >         w2.enable(false);
> >         assert(!w.is_enabled()) // !
> >     }
> > 
> > Pure & beautiful, IMO.
> 
> Consider a widget class that performs some action on 
> enabling/disabling (like dimming a button). In that case the 
> action would be performed for w2 but not for w.

Oh, sorry for a confusion, 'enable' was a bad name for the method because I
didn't mean that semantics (and the whole example just wouldn't make much
sense). 

It should have been 'is_enabled(bool_arg_t)' instead, because I was thinking
in terms of the model where the widget implementation itself _queries_ the
'widget' object's properties to perform the appropriate system actions, like
dimming a button. 

So, the corrected example would be:

    class widget
    {
    public:
        // ...
        typedef boost::function<bool ()> bool_arg_t;
        
        self_t&     is_enabled(bool_arg_t a_enabled); // note the signature!
        bool        is_enabled() const;
    };

    int main()
    {
        widget w;
        w.is_enabled(true); // ordinary syntax/semantics
        assert(w.is_enabled())
        
        widget w2;
        w.is_enabled(boost::bind(&widget::is_enabled, &w2)); // here!
        w2.is_enabled(false);
        assert(!w.is_enabled()) // !
    }

I hope the name change makes the semantics of the above clearer.

Aleksey
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to