什么样的设计模式可以在不更改签名的情况下访问 lambda 函数中的封装范围变量?

问题描述 投票:0回答:2

我正在使用一个优化器库(布伦特方法),它有一个函数“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() 接受。

c++ lambda functor
2个回答
0
投票

代替函数指针,让

local_min
接受任意类型。这将使您可以根据需要向其传递一个带有捕获的 lambda

template<typename F>
double local_min(F f) 
{
  // ... same usage as before
}

可调用的

f
的行为方式仍与以前相同,即类似于接受
double
并返回
double
的函数。如果您使用不兼容的类型调用
local_min
,它将无法编译。如果需要,您可以使用
static_assert
检查这一点,以便向用户提供一条不错的错误消息。


0
投票

而不是通过引用捕获,它要求值在调用函数的范围内可用。按价值捕获怎么样?

int main(){
    double value = 0.5;

    auto f = [value](double x) {
        return value + x * x;
    };

    double fx = local_min(f);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.