无参数函数,类和模板

时间:2018-02-01 11:20:39

标签: c++ class templates

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

我的问题是我不知道如何处理多变量函数的1D积分中的常量变量,即f(x)dx的积分有效,但我不知道计算{的积分的语法{1}}。

我认为它与类和模板有关,我根本不熟悉这些,而且我在使用指针,额外的功能等等都没有成功。

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)集成到3.此代码有效,但如果我取消注释上面的3行,即尝试将x=1ftwo(x, 2)集成到3,我得到

x=1

我似乎缺乏对C ++中某些基本概念的理解,但我不知道哪一个,这使得谷歌难以解决问题。这也是我第一次遇到我可以传递一个没有参数的函数,即 invalid initialization of non-const reference of type ‘double&’ from an rvalue of type ‘double’| 而不是romberg(fone,..),我不知道如何调用它。

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

根据this deprecated librarytemplate <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

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

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