我正在使用一个优化器库(布伦特方法),它有一个函数“local_min”。
其原型大致定义如下:
double local_min ( double f ( double x ) );
该函数接受函数指针(?)作为参数。假设 f(x) 是函数...优化器将测试 x 的各种值以找到 f(x) 的最小值。
local_min函数的调用如:
double f(double x){
return .5 + x * x;
}
int main(){
double fx = local_min(f);
return 0;
}
我遇到的麻烦是我想将 .5 定义为函数的标量,但我不想使用全局值。理想情况下,我会将所有内容集中在一个班级中。但我尝试的一切,我更改了 f(x) 的函数签名,并且 local_min() 将不再接受它。
例如:
int main(){
double value = 0.5;
auto lambda = [](double x) {
return value + x * x;
};
double fx = local_min(f);
return 0;
}
不起作用,因为value不可访问。同样,
int main(){
double value = 0.5;
auto lambda = [&](double x) {
return value + x * x;
};
double fx = local_min(f);
return 0;
}
更改了函数签名,并且不再被 local_min() 接受。
代替函数指针,让
local_min
接受任意类型。这将使您可以根据需要向其传递一个带有捕获的 lambda
template<typename F>
double local_min(F f)
{
// ... same usage as before
}
可调用的
f
的行为方式仍与以前相同,即类似于接受 double
并返回 double
的函数。如果您使用不兼容的类型调用 local_min
,它将无法编译。如果需要,您可以使用 static_assert
检查这一点,以便向用户提供一条不错的错误消息。
而不是通过引用捕获,它要求值在调用函数的范围内可用。按价值捕获怎么样?
int main(){
double value = 0.5;
auto f = [value](double x) {
return value + x * x;
};
double fx = local_min(f);
return 0;
}