无参数函数、类和模板
argumentless function, classes and templates
我正在尝试使用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
被推导为double
,func
参数是对double
的非常量左值引用。不能绑定到右值参数(这是错误消息所说的。
您可能希望从ftwo
创建一个一元函数,您可以通过按照 @Jarod42 的建议使用std::bind
或 lambda 函数来完成。
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类