我需要将成员函数传递给gsl_function,并使用此[link](A function pointer issue. How to efficiently interface with C API (ie. GSL) from C++ class?)中描述的包装器。它有效,但是在尝试理解它时我有点困惑。基本上,我在代码中将三个void *参数标记为ptr_par_0ptr_par_1ptr_par_2,很明显ptr_par_0=patr_par_1但它们似乎从未在代码中初始化,对吗? ptr_par_2确实已初始化为*this,但是ptr_par_0ptr_par_1foo_wrapper函数的局部变量,因此我认为它们应隐藏ptr_par_2并需要自己进行初始化。我想可能有些我不知道的事,在此先感谢您的澄清。

class MyClass
{
    double foo(double x)
    {
       ...
    }
    static double foo_wrapper(double x, void *params)   //ptr_par_0
    {
        return static_cast<MyClass*>(params)->foo(x);   //ptr_par_1
    }

    double bar(double x)
    {
        ...
        gsl_function F;
        F.function=&MyClass::foo_wrapper;
        F.params=this;                                  //ptr_par_2

        // invoke GSL function passing in F
        ...
    }
};

最佳答案

将评论变成答案:

GSL将调用类似F.function(x, F.params);的内容(在GSL_FN_EVAL(&F,x)中)

所以MyClass::foo_wrapper(x, this_from_bar)

关于c++ - 有没有为void *参数隐藏的名称?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31478688/

10-11 19:12
查看更多