长时间浏览器,这里首次提问。我写了很多脚本来完成各种1D数值积分方法,并将它们编译成一个库。我希望图书馆尽可能灵活地考虑其能够整合的内容。C++:以任意数量参数作为参数传递函数
这里我举一个例子:一个非常简单的梯形法则示例,其中我将一个指针传递给要集成的函数。
// Numerically integrate (*f) from a to b
// using the trapezoidal rule.
double trap(double (*f)(double), double a, double b) {
int N = 10000;
double step = (b-a)/N;
double s = 0;
for (int i=0; i<=N; i++) {
double xi = a + i*step;
if (i == 0 || i == N) { s += (*f)(xi); }
else { s += 2*(*f)(xi); }
}
s *= (b-a)/(2*N);
return s;
}
这适用于只有一个参数的简单函数。例如:
double a = trap(sin,0,1);
但是,有时我可能想要集成更多参数的东西,如二次多项式。在这个例子中,系数将在整合之前由用户定义。示例代码:
// arbitrary quadratic polynomial
double quad(double A, double B, double C, double x) {
return (A*pow(x,2) + B*x + C);
}
理想情况下,我将能够做这样的事情来整合它:
double b = trap(quad(1,2,3),0,1);
但显然不起作用。我已经通过定义具有系数作为成员的利益为成员函数的函数的类解决此问题得到:
class Model {
double A,B,C;
public:
Model() { A = 0; B = 0; C = 0; }
Model(double x, double y, double z) { A = x; B = y; C = z; }
double func(double x) { return (A*pow(x,2)+B*x+C); }
};
然而,然后我的积分功能需要改变把对象作为输入,而不是一个函数指针:
// Numerically integrate model.func from a to b
// using the trapezoidal rule.
double trap(Model poly, double a, double b) {
int N = 10000;
double step = (b-a)/N;
double s = 0;
for (int i=0; i<=N; i++) {
double xi = a + i*step;
if (i == 0 || i == N) { s += poly.func(xi); }
else { s += 2*poly.func(xi); }
}
s *= (b-a)/(2*N);
return s;
}
这工作得很好,但由此产生的图书馆是不是很独立的,因为它需要在某处被定义的类模型。此外,理想情况下,模型应该能够从用户到用户改变,所以我不想修复它在一个头文件。我试图使用函数模板和函数来获得这个工作,但它不是很独立,因为模板应该在头文件中定义(除非你想显式实例化,我不这样做)。总结:有没有什么办法可以让我的集成函数接受具有可变数量输入参数的任意1D函数,同时仍然保持足够的独立性,以便可以将它们编译为独立的库?在此先感谢您的建议。
['std :: bind'](http://en.cppreference.com/w/cpp/utility/functional/bind) – 2013-04-11 23:21:09