Re: ptr to function with param
Robster wrote:
So I have a method like:
void pollMode( Controller& ctrl ) {
while( ok ) {
Mode currMode = ctrl.getMode( );
// do some other stuff
}
}
then:
void SomeClass::startPolling( ) {
// I want to pass ctrl to pollMode
Controller* ctrl = m_pCtrl.get();
void (*pPollMode) ( Controller&) = pollMode;
pPollMode( *ctrl ); // ok, this works.
// I want to pass ctrl to pollMode
// so I can do this ...
boost::thread thr( pPollMode ); // ooops
}
What do I need to do to pass the function ptr with the param, without
making the param global?
Since the parameter is an object, one approach would be to turn the
pollMod() function into a Controller method, say "poll", and then pass
a Controller pointer to the thread:
void Controller::poll()
{
while( ok )
{
Mode currMode = getMode( );
// do some other stuff
}
}
void SomeClass::startPolling( )
{
Controller* ctrl = m_pCtrl.get();
boost::thread thr( ctrl );
}
The new thread must then call ctrl->poll() when it runs.
One weakness with this approach is that thread argument must be a
pointer to a Controller. A more flexible solution would be to pass any
kind of "Pollster" object (which implements a poll()) method) to the
thread. The thread still calls poll() on the object - but this time the
function call would be dispatched "virtually" - based on the dynamic
type of the pointed-to object.
As an exmple, here is simple declaration for the abstract class,
"Pollster":
class Pollster
{
public:
virtual void poll() = 0;
virtual ~Pollster() {}
};
And then have Controller (and any other type whose pointer is to be
passed to the thread as an argument) derive from this Pollster abstract
class and implement its own poll() method.
Greg
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]