Re: Interface problem
I just run in the following problem.
I'm using the gsl library that requires an input function to be of the
form:
struct gslFunction
{
double (*func)(double x, void* p) function;
void* params;
}
To be able to interface to the gsl I wrote this "converter" (based on
root's mathmore library gsl wrapper):
// Use in combination with boost::bind.
template<class F>
static double gslFunctionAdapter( double x, void* p)
{
// Here I do recover the "right" pointer, safer to use static_cast
than reinterpret_cast.
F* function = static_cast<F*>( p );
return (*function)( x );
}
template<class F>
gsl_function convertToGslFunction( const F& f )
{
gsl_function gslFunction;
const void* p = &f;
assert (p != 0);
gslFunction.function = &gslFunctionAdapter<F>;
gslFunction.params = const_cast<void*>( p ); // Just to eliminate
the const.
return gslFunction;
}
and use this like:
gslFunction gslF = convertToGslFunction( boost::bind( &Sde::drift,
&sde, _1 ) );
However the problem is that now I'm using boost::function in my
algorithms, following your suggestion.
So in an algorithm I get into the situation:
boost::function<double (double)> f = boost::bind( &Sde::drift, &sde,
_1 );
gslFunction gslF = convertToGslFunction( f );
I know that this "double-wrapper" is bad for efficency, but I can't
see any other way to use the gsl library without modification on the
gsl library itself.
The problem is that this does not work! When I call the gslF the
software crash.
Debugger inspection reveals that the line:
F* function = static_cast<F*>( p ); // in gslFunctionAdapeter
fails to "recover" my boost::funcion.
Is there anything I could do to solve the situation?
The two requirements are:
1) Be able to implement the approach suggested in the post above: that
is have boost::function private member data in my algorithms
2) Interface to the gslFunction struct without any modification to the
gsl library.
Thank you again for your help.
Best Regards
StephQ