数值配方:如何将函数作为C 中函数NEWT的参数传递

Numerical recipes: How to pass function as argument of function newt in c++

本文关键字:函数 NEWT 参数传递      更新时间:2023-10-16

我的问题与数值配方有关。我有一个全局函数,该函数计算要最小化的函数向量

VecDoub vecfunc(VecDoub_I x) {
  // code is here
}

在类函数 run 中,我尝试调用数值配方函数newt,该功能读取我的函数 vecfunc ,如图所示,

class A {
    void run() {
        VecDoub_IO pt;
        pt.resize(2);
        pt[0] = 0.5;
        pt[1] = 0.5;
        bool check = false;
        newt<VecDoub>(pt, check, &vecfunc);
    }
}

函数 newt 被声明为

template <class T>
void newt(VecDoub_IO &x, Bool &check, T &vecfunc)

为什么我会收到以下编译器错误?

error C2664: 'newt' : cannot convert parameter 3 from 'VecDoub (__cdecl *)(VecDoub_I)' to 'VecDoub &'

在调用newt时,您会明确指定TVecDoub(指定的newt<VecDoub>),但是您将函数的地址传递给了它,因此编译器无法将函数转换为VecDoub&。如果要在newt中使用VecDoub&,请调用vectfunc并将其存储在临时变量中,然后将该变量传递给该函数(因为在newt中,最后一个参数是对T的引用),但是如果您真的需要newt中的函数,那么您为什么要写入newt<VecDoub>(pt, check, &vecfunc)虽然您可以编写newt(pt, check, &vecfunc)并让C 推论您的类型?除此之外,要在newt中接收功能,请不要通过参考获得它们,而是按值获取它们,因此newt应声明为:

template <class T>
void newt(VecDoub_IO &x, Bool &check, T vecfunc)

由于功能通常是小物体或指针,因此它会起作用,并且不会降低性能

,因为您应该调用函数并将返回值传递为参数,而不是函数本身。

newt<const VecDoub>(pt, check, vecfunc(something) );

我添加了const,因为参考需要恒定,否则vecfunc的返回值无法绑定到它,因为它是临时的。

解释:

newt<VecDoub>(pt, check, &vecfunc);

尝试调用类似于

的函数
newt_VecDoub(VecDoub_IO &x, Bool &check, VecDoub &vecfunc);

您尝试通过的第三个参数是&vecfunc,它具有类型VecDoub (__cdecl *)(VecDoub_I),因此显然无法正常工作。