Hi! I can't make SetEventHandler to a free/global function because the EventFunction that boost::bind created should be added to a private std::map of CWindow. Or I need an extra member method that only adds the boost::function to the map. But it now works with a static_cast in SetEventHandler how Sam suggested. :) At the moment I am contented with the interface of SetEventHandler, but maybe I have to change it later. Time will reveal. ;-)
Thanks Peter, thanks Douglas. cu, Matthias ----- Original Message ----- From: "Peter Dimov" <[EMAIL PROTECTED]> To: "Boost mailing list" <[EMAIL PROTECTED]> Sent: Wednesday, February 19, 2003 3:37 PM Subject: Re: [boost] Encapsulate boost::bind in a template method > 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 _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost