是否隐藏了 void* 参数的名称?
is there name hiding for void* params?
我需要将一个成员函数传递给 gsl_function,并使用了 [link] (A function pointer issue. How to efficiently interface with C API (ie. GSL) from C++ class?) 中描述的包装器。它有效,但在试图理解它时我有点困惑。基本上我在代码中标记了三个 void* 参数 ptr_par_0
、ptr_par_1
、ptr_par_2
,很明显 ptr_par_0=patr_par_1
但它们似乎从未在代码中初始化,是真的? ptr_par_2
确实被初始化为*this
,但是ptr_par_0
和ptr_par_1
是foo_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)
我需要将一个成员函数传递给 gsl_function,并使用了 [link] (A function pointer issue. How to efficiently interface with C API (ie. GSL) from C++ class?) 中描述的包装器。它有效,但在试图理解它时我有点困惑。基本上我在代码中标记了三个 void* 参数 ptr_par_0
、ptr_par_1
、ptr_par_2
,很明显 ptr_par_0=patr_par_1
但它们似乎从未在代码中初始化,是真的? ptr_par_2
确实被初始化为*this
,但是ptr_par_0
和ptr_par_1
是foo_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)