Boost logo

Boost Users :

From: Philippe Després (pdespres_at_[hidden])
Date: 2005-03-16 11:57:29


ok thanks a lot. I do not like NR either but I did not find a good C++
alternative yet...

Ben Hutchings wrote:
> 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.
>
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users

-- 
Philippe Després
Associate Specialist
UCSF Physics Research Lab
185 Berry Street suite 350
San Francisco CA 94107
(415) 353-4501 (office)
(650) 497-2261 (home)
pdespres_at_[hidden]
PGP PUBLIC KEY  http://itsa.ucsf.edu/~despres/publickey.txt

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net