无参数函数、类和模板

argumentless function, classes and templates

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

我正在尝试使用C++中的数值配方实现的Romberg方法进行数值积分。

我的问题是我不知道如何处理多变量函数的一维积分中的常量变量,即f(x)dx的积分工作,但我不知道计算f(x,y=2,z=5,...)dx积分的语法。

我相信它与类和模板有关,我根本不熟悉这些,我玩指针、额外函数等没有成功。

#include <iostream>
#include <math.h>
#include <NR/nr3.h>
#include <NR/interp_1d.h>
#include <NR/quadrature.h>
#include <NR/romberg.h>
double fone (double x)          { return 2*x*x*x;   }
double ftwo (double x, double y){ return 2*x*x*x*y; }
int main()
{
double Ione = qromb(fone, 1, 3);
std::cout << Ione << std::endl;
//double Itwo = qromb(ftwo(x, 2.0), 1, 3);
//std::cout << Itwo << std::endl;
}

在这里,我将fone(x)x=1集成到 3。这段代码有效,但是如果我取消注释上面的 3 行,即尝试将ftwo(x, 2)x=1集成到 3,我会得到

invalid initialization of non-const reference of type ‘double&’ from an rvalue 
of type ‘double’|

似乎我对C++中的一些基本概念缺乏理解,但我不知道是哪一个,这使得很难用谷歌搜索问题。这也是我第一次遇到我可以在没有参数的情况下传递函数,即romberg(fone,..)而不是romberg(fone(x),..),我不知道这是怎么称呼的。

如果有人能指出我需要学习的方向,我将不胜感激。谢谢!

您可以使用lambda来绑定参数:

auto f2 = [](double x) { return ftwo(x, 2.0);};
Itwo = qromb(f2, 1, 3);

根据 https://github.com/leonid-pishchulin/humanshape/blob/master/shapemodel/lib/nr/romberg.h,qromb函数定义为:

template <class T>
Doub qromb(T &func, Doub a, Doub b, const Doub eps=1.0e-10) { /* ... */ }

当您调用时

double Itwo = qromb(ftwo(x, 2.0), 1, 3);

将类型为double的 rvalue 对象作为第一个参数(ftwo函数调用的结果)传递。因此,模板参数T被推导为doublefunc参数是对double的非常量左值引用。不能绑定到右值参数(这是错误消息所说的。

您可能希望从ftwo创建一个一元函数,您可以通过按照 @Jarod42 的建议使用std::bind或 lambda 函数来完成。