For the moment I would prefer to keep things as they are, just to avoid extra work. To access a function make a new gsl_function struct directly, gsl_function f; f.function = fdf.f; f.params = fdf.params; Maybe we'll change this in the future. I agree that current system could be improved.