我想知道c ++中是否有任何方法可以传递函数和其他函数,并修复了一些参数。
这里解释一个例子:
#include<math.h>
#include<iostream>
double myfunc(double x) { return 5*x; }
double gaussian( double x , double s , double v) { return exp( (x-v)*(x-v) / (s*s) ) ; }
double Trapeze1D(const double x_min, const double x_max, double (*fonction)(double) )
{
double nb_pts = 100.0 ;
double integrale = 0.0 ;
double dx = ( x_max - x_min ) / (double) nb_pts ;
double x_k ;
while ( k < nb_pts-1 )
{
k++;
x_k = x_min + (double) k * dx ;
integrale += fonction(x_k) ;
}
integrale *= dx ;
return integrale ;
}
int main()
{
cout << Trapeze1D(0.0,1.0,myfunc) << endl ; // <-- works fine
cout << Trapeze1D(0.0,1.0, gaussian(double , 2,3) ) << endl ; // <-- I would like something like that ...
// Also tried :
double tmp(double x) = gaussian(x, 2,3) ; // <-- does not work C++ does not allow definition of function inside function ...
cout << Trapeze1D(0.0,1.0, tmp) << endl ;
}
我的问题如下,我将不得不进行整合(最终集成方法会更加复杂)几种不同类型的函数,其中许多依赖于高斯,多项式,beta定律等参数...... / p>
我也试过使用这样的类:
class gaussian
{
public:
double eval(double x) ;
void get(double s, double v) ;
private:
double s ;
double v ;
}
double gaussian::eval(double x){ return exp( (x-v)*(x-v) / (s*s) ) ; }
int main()
{
gaussian G;
G.get(1.0,2.0) ;
cout << Trapeze1D(0.0,1.0,G.eval) << endl ; // <-- error
}
但是我收到以下错误:必须调用对非静态成员函数的引用
任何帮助都将受到高度赞赏。 非常感谢
答案 0 :(得分:1)
有几种方法可以做到这一点。最简单的是你真正非常接近的那个:
int main()
{
std::cout << Trapeze1D(0.0, 1.0, myfunc) << std::endl;
auto tmp = [](double x){ return gaussian(x, 2, 3); };
std::cout << Trapeze1D(0.0, 1.0, tmp) << std::endl;
}
这会创建一个包含高斯函数的临时lambda函数。如果你不熟悉lambdas,这是在文件顶部声明tmp的临时版本:
double myfunc(double x) { return 5*x; }
double gaussian( double x , double s , double v) { return exp( (x-v)*(x-v) / (s*s) ) ; }
double tmp(double x) { return gaussian(2, 3, x); }
如果您希望这更灵活,并且您有兴趣定期更改s
和v
,那么您可以随时进行仿函数课程,但这会涉及到一些改变您的工作Trapeze1D
函数可以接受函数指针或函子:
template <typename FuncType>
double Trapeze1D(const double x_min, const double x_max, FuncType fonction)
{
...
integrale += fonction(x_k);
...
}
class gaussian_functor
{
public:
gaussian_functor(double s, double v)
: m_s(s)
, m_v(v)
{}
double operator() (double x) const { return exp((x - m_v)*(x - m_v) / (m_s*m_s)); }
private:
double m_s;
double m_v;
};
int main()
{
std::cout << Trapeze1D(0.0, 1.0, myfunc) << std::endl;
gaussian_functor my_functor(2.0, 3.0);
std::cout << Trapeze1D(0.0, 1.0, my_functor) << std::endl;
}