gpt4 book ai didi

以函数为参数的 C++ 函数模板取决于附加参数

转载 作者:行者123 更新时间:2023-11-28 02:11:11 25 4
gpt4 key购买 nike

我有线搜索算法的实现,例如this Brent method ,我想制作它的通用模板,这将允许我优化关于一个参数 x 的任何标量函数,但我想插入 error_func 不依赖仅在 x 上,但也在一些其他参数上。

也许(伪)代码更能说明我想做什么:

通用库:

typedef double( *scalar_function1D )(double);

// this function vary "x" in order to make error_func(x) close to zero
template< scalar_function1D error_func>
double lineSearch_Brent ( double x, double xmin, double xmax, double tol ){
double f = error_func(x);
while( abs( f )>tol ){
f = error_func(x);
// body of line search algorithm, details not important
}
return x;
}

特定用例:

// we would like to find optimal "x" for this model_error function for given "params"
double model_error( double x, int n, double * params ... /* many other parameters there */ ){
// body of specific model for error function which depends on "x" but also on other parameters; details not importaint
}

double optimize_x_for_given_model( double xmin, double ymin, int n, double * params ){
// how to plug in "params" now ?!?
return lineSearch_Brent<model_error>( 0.5*(xmin+xmax), xmin, xmax, 1.0e-8 );
}

明显的问题model_error 不是 scalar_function1D 类型,因为它有更多参数。

我知道这种问题可以通过面向对象编程来解决,例如像这样:

class Scalar_function1D{ public virtual double eval(double); } // shared interface

class Model_error : public Scalar_function1D { // specific implementation
public:
int n;
double * params;
virtual double eval(double){
// body which depends on "params"
};
}

但我想知道如何使用函数模板来完成。

最佳答案

代替传递非类型模板参数:

template< scalar_function1D error_func>
double lineSearch_Brent ( double x, double xmin, double xmax, double tol ) { ... }

只需传递一个任意函数对象:

template <class ScalarFunction1D>
double lineSearch_Brent (ScalarFunction1D error_func, double x,
double xmin, double xmax, double tol ) { ... }

例如,这允许您传入一个捕获其他一些参数的 lambda:

lineSearch_Brent([=](double x){ return model_error(x, n, params); },
0.5*(xmin+xmax), xmin, xmax, 1.0e-8);

或任何合适的。

关于以函数为参数的 C++ 函数模板取决于附加参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35638289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com