$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Ben Hutchings (ben.hutchings_at_[hidden])
Date: 2005-03-16 11:28:14
Philippe Després wrote:
> Hello,
> 
> I am using Numerical Recipes routines and I am trying to call this function
I wouldn't advise using any of that source code.  It's not good C++ code 
and the licence fees could get expensive.  See 
<http://www.accu.org/cgi-bin/accu/rvout.cgi?from=0ti_n&file=n003134a> 
for more information.
> void mrqmin(Vec_I_DP &x, Vec_I_DP &y, Vec_I_DP &sig, Vec_IO_DP &a,
>     Vec_I_BOOL &ia, Mat_O_DP &covar, Mat_O_DP &alpha, DP &chisq,
>     void funcs(const DP, Vec_I_DP &, DP &, Vec_O_DP &), DP &alamda);
> 
> 
> and I would like to call it with funcs being a member function pointer 
> of one of my class.  I can declare the member as static but then I 
> cannot access member variable, which is the goal here.
You can access static member variables.
 > Someone suggested to use boost to solve the problem.
<snip>
Boost doesn't have a solution to this problem.  Boost.Bind and 
Boost.Function help you to adapt functions, but they produce function 
objects that are of no use with a function that requires a function 
pointer, such as the C-style code found in Numerical Recipes.  Functions 
that call-back through function pointers should always pass through an 
arbitrary context pointer.  This allows you to define a static member 
function like this:
void my_class::my_callback(void * context, other args...)
{
     static_cast<my_class *>(context)->real_callback(other args...);
}
and then pass &my_callback and this as arguments to the other function. 
  However, it looks like mrqmin doesn't even pass through any context, 
so this won't help you.  An alternative is to copy this into a static 
member variable - or, in a multithreaded application, into TLS - before 
making the call.  Then you would define your call-back function like this:
void my_class::my_callback(args...)
{
     static_cast<my_class *>(current_instance_)->real_callback(args...);
}
Ben.