Boost logo

Boost :

From: Aleksey Gurtovoy (agurtovoy_at_[hidden])
Date: 2002-11-09 07:37:12


Dirk Gerrits wrote:
> > So, the corrected example would be:
> >
> > class widget
> > {
> > public:
> > // ...
> > typedef boost::function 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.
>
> I still don't get it. Have I used to few widget libraries? ;)

OK, we are drifting from the actual topic here, but I really don't like the
fact that I can't express myself clearly tonight :). So, here we go:

    class widget_model
    {
     public:
        // ...
        typedef boost::function<bool ()> bool_arg_t;
        
        self_t& is_enabled(bool_arg_t a_enabled)
        {
            is_enabled_ = a_enabled;
            return *this;
        }
        
        bool is_enabled() const
        {
            return is_enabled_();
        }
        
     private:
        bool_arg_t is_enabled_;
    };

    class win32_widget_impl
    {
     public:
        win32_widget_impl( /* ... */)
        {
            // setup this->on_idle() to be called, well, on idle
        }
     
        void on_idle()
        {
            // sync itself with the model
            ::EnableWindow(hwnd_, model_->is_enabled());
        }
        
     private:
        HWND hwnd_;
        ref_ptr<widget_model,!0> model_;
    };

Since the model is passive here, everything works as per my first example
(given 'widget' -> 'widget_model' substitution).

Aleksey


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk