如何解决什么样的设计模式可以在不改变签名的情况下访问 lambda 函数中的封装作用域变量?
我正在使用具有函数“local_min”的优化器库(Brent 方法)。
它的原型大致定义如下:
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
进行检查,以便为用户提供一个很好的错误消息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。