callback to a member function

  • Thread starter Gert Van den Eynde
  • Start date
G

Gert Van den Eynde

Hi all,

What is "the best" way to have a callback from a C (or a Fortran) routine to
a member function of a class? An example: I have objects of a class where
double operator(double) is defined. I have a both a C and Fortran routine -
that I cannot modify, nor convert to C or whatever, I'm stuck with them -
that take a double f(double) function pointer as argument. These C and
Fortran routines do a numerical quadrature using the object's operator().
Hence, I need to provide this C function with a pointer to a member
function. I've read the chapter in the C++ faq lite, I've come across the
function pointer tutorial and read that and tested this approach (and it
worked). But I was wondering if there is a more elegant way (no more global
variables and such). I'm not really following TR1, but I heard something of
a tr1::function, tr1::mem_fn etc. Can they be used to clean up the code?

Thanks,
gert
 
A

Andrey Tarasevich

Gert said:
...
What is "the best" way to have a callback from a C (or a Fortran) routine to
a member function of a class? An example: I have objects of a class where
double operator(double) is defined. I have a both a C and Fortran routine -
that I cannot modify, nor convert to C or whatever, I'm stuck with them -
that take a double f(double) function pointer as argument. These C and
Fortran routines do a numerical quadrature using the object's operator().
Hence, I need to provide this C function with a pointer to a member
function. I've read the chapter in the C++ faq lite, I've come across the
function pointer tutorial and read that and tested this approach (and it
worked). But I was wondering if there is a more elegant way (no more global
variables and such). I'm not really following TR1, but I heard something of
a tr1::function, tr1::mem_fn etc. Can they be used to clean up the code?
...

Unfortunately, no. There's no standard and portable way to turn an
'object + member function pointer' pair into a regular function pointer
in C++.

Some implementations provide a non-standard functionality called
'closure' that does exactly that (see Borland's C++ compiler for
example). It can also be implemented in plaform-dependent way by using
assembly language, for example. But there's no way to do this in pure C++.
 
P

peter koch

Gert Van den Eynde skrev:
Hi all,

What is "the best" way to have a callback from a C (or a Fortran) routine to
a member function of a class? An example: I have objects of a class where
double operator(double) is defined. I have a both a C and Fortran routine -
that I cannot modify, nor convert to C or whatever, I'm stuck with them -
that take a double f(double) function pointer as argument. These C and
Fortran routines do a numerical quadrature using the object's operator().
Hence, I need to provide this C function with a pointer to a member
function. I've read the chapter in the C++ faq lite, I've come across the
function pointer tutorial and read that and tested this approach (and it
worked). But I was wondering if there is a more elegant way (no more global
variables and such). I'm not really following TR1, but I heard something of
a tr1::function, tr1::mem_fn etc. Can they be used to clean up the code?

Thanks,
gert

You can't as the memberfunction needes two arguments - the double and
the this-pointer. One way to come around this problem is to store (a
pointer to) the object in global data and then use that for your
function, but I agree that this is a kludge.

/Peter
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top