On Mon, Apr 26, 2010 at 8:25 AM, Sven Knoblich <sven.knobl...@gmx.com> wrote:
> Hello all,
> i have a problem by using WTimer::singleShot(..) with boost::bind.
>
> WTimer
> --------
> #ifndef WT_TARGET_JAVA
> template <class T, class V>
> void WTimer::singleShot(int msec, T *receiver, void (V::*method)())
> {
>  WTimer *timer = new WTimer();
>  timer->setSingleShot(true);
>  timer->setInterval(msec);
>  timer->setSelfDestruct();
>  timer->timeout().connect(receiver, method);
>  timer->start();
> }
> #endif // WT_TARGET_JAVA
>
> }
>
>
> The call has to go to a method with two parameters
>
> MyClass
> --------
> void MyClass::call( const string& rstrName, const int nValue);
>
>
> Call
> ====
>
> WTimer::singleShot( 1, this, boost::bind( &MyClass::cal,
>                                          this,
>                                          rstrName,
>                                          nValue));
>
>
> ->now i get the compiler error c2784: could not cast 
> boost::_bi::bind_t<R,F,L> to void (__thiscall V::* )(void)!
>
> Any idea how to cast the boost-type to the new signature?
>
> Many thanks in advance,
> Sven

Not at computer, but looking at the dosygen on the website, the signature is:
"""
template<class T, class V>
void Wt::WTimer::singleShot     (       int      msec,
                T *     receiver,
                void(V::*)()    method  
        )                       [inline, static]
"""

Now this would dictate that you need to use something like:
"""
WTimer::singleShot( 1, this, boost::bind( &MyClass::cal,
                                         boost::_1,
                                         rstrName,
                                         nValue));
"""

However, it seems to use a raw method pointer instead of accepting
generic function pointers (honestly, this is *BAD* design and needs to
be fixed), so it will probably not work.  The Wt code needs to be
changed to support another overload like:
"""
template<class F>
void Wt::WTimer::singleShot     (       int      msec,
                F       func    
        )                       [inline, static]
"""

In which case, that overload would support your thing perfectly, like:
"""
WTimer::singleShot( 1, boost::bind( &MyClass::cal,
                                     this,
                                     rstrName,
                                     nValue));
"""

I have no clue why they use their current style, it vastly limits the
usefulness of that, heck, with the new style I propose, then something
like this would be possible:
"""
#include <boost/spirit/include/phoenix.hpp>
using namespace boost::phoenix;

// elswhere:

WTimer::singleShot( 1, if_(ref(i)%5)
                           [displayMessage(),ref(i)=0]
                       .else
                           [ref(i)++]);
"""


You can however work around the issue by just making your own
singleshot global/static function:
"""
template <F>
void mySingleShot(int msec, F func)
{
 WTimer *timer = new WTimer();
 timer->setSingleShot(true);
 timer->setInterval(msec);
 timer->setSelfDestruct();
 timer->timeout().connect(func); // I am pretty sure that connect
supports that overload fine
 timer->start();
}
"""

Then use it like:
"""
mySingleShot( 1, boost::bind( &MyClass::cal,
                               this,
                               rstrName,
                               nValue));
"""

------------------------------------------------------------------------------
_______________________________________________
witty-interest mailing list
witty-interest@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/witty-interest

Reply via email to