Matthias Hoffrichter wrote:
> Hi,
>
> I want to encapsulate boost::find in a template method in a base
> class for easier use.
> Here is some code:
>
> #include <boost/function.hpp>
> #include <boost/bind.hpp>
>
> class CWindow {
> public:
>  CWindow() {
>   SetEventHandler(&CWindow::OnCreate); // this call works
>  }
>  long OnCreate() {
>   return 0;
>  }
>  template<typename T> void SetEventHandler(long (T::*Function)()) {
>   boost::function<long> EventFunction = boost::bind(Function, this);
>   // ...
>   // Add EventFunction into a std::map
>  }
> };
>
> class CButton : public CWindow {
> public:
>  CButton() {
>   SetEventHandler(&CButton::OnPaint); // this call doesn't compile
>  }
>  long OnPaint() {
>   return 0;
>  }
> };

In CWindow::SetEventHandler<CButton>, 'this' is a CWindow*. You can't invoke
CButton::OnPaint using a pointer to CWindow.

The easiest solution is probably to make SetEventHandler a free function:

template<class F, class T> void setEventHandler(F f, T * p)
{
   boost::function<long> EventFunction = boost::bind(f, p);
   // ...
   // Add EventFunction into a std::map
}

and then simply use setEventHandler(&CButton::OnPaint, this) in
CButton::CButton().

You'll soon find that this is not _that_ easier to use compared to

setEventHandler(bind(&CButton::OnPaint, this));

and the latter is much more flexible:

setEventHandler(bind(&CButton::OnMessage, this, WM_PAINT));

but that's another story. :-)

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

Reply via email to