By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
454,376 Members | 1,528 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 454,376 IT Pros & Developers. It's quick & easy.

callback to a member function

P: n/a
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
Nov 7 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
Gert Van den Eynde wrote:
...
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++.

--
Best regards,
Andrey Tarasevich

Nov 7 '05 #2

P: n/a

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

Nov 7 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.