Re: Object oriented callbacks and differences in member vs non-member function pointers
In article <1181326689.777212.184660@p47g2000hsd.googlegroups.com>,
Faraz Babar <fbabar@gmail.com> wrote:
union call_back
{
void (thread<task>::*filler)();
void * (*address)(void *);
} routine;
public:
thread(task& p_worker) : worker(p_worker)
{
routine.filler = &thread<task>::go;
pthread_attr_init(&attr);
}
void start()
{
pthread_create (&id, &attr, routine.address, this);
}
It appears as if you want to call a member function filler of a class
thread<class> as a free function. Storing one type in a union and
accesing it as another is undefinded behavior, best avoided.
What are you mean by these two 'pseudo' function pointers with
different return types? I see no virtual's here so using a static
member function seems easiest, assuming that the function recieving the
call back function is in c++ and the void * is a thread<task> * and the
receiving function is 'cast in stone'.
template <class task>
class thread
{
typedef void (thread::PMF)();
PMF call_me;
public:
static void *address(void *p)
{
thread<task> *p_thread = p;
p_thread->*call_me();
return 0;
}
// ...
};
done and nothing exoctic.
If this is not the case then more indirection is neeeded. and not via
unions:)
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]