返回一个计算了参数的函数

Return a function with parameters evaluated

本文关键字:算了 参数 函数 计算 一个 返回      更新时间:2023-10-16

我对C++相当陌生,我想执行以下操作,但不知道如何做。

我想基于带有一些参数的模板定义一个函数。假设我们有f(x)=a*x+b,但参数ab将作为参数传递。

我想定义一个函数create_function(double a, double b),它返回带有aa*x+b,并b对传递的任何参数进行评估,以便我可以使用另一个函数func( double x )来计算它。

目标是使用给定的参数只创建一次函数,以便它可以被另一个例程重复调用,只需f(x)。真正的功能比这复杂得多,但我能够适应它。

我一直在看这篇文章,它会与此类似,但我不知道如何使其适应返回仍然依赖于x的函数。

你可以用lambdas做到这一点:

auto create_function(double a, double b)
{
return [a, b](double x) { return a * x + b; };
}
void test()
{
auto func = create_function(2.0, 3.0);
double y = func(4.0); // y is now 11
}

演示(显示编译器已经知道func(4.0)将始终返回 11(

您可以使用 lambda 函数来实现此目的:

auto f = [a, b](auto x) { return a * x + b; };

。或者,要实际将其包装到函数中:

auto create_function(double a, double b) {
return [=](auto x) { return a * x + b; };
}

实际上,lambda 函数只是创建函数对象的一种 [更] 方便的方法。

您可以使用 std::bind:

#include <functional>
#include <iostream>
double f(double a, double b, double x) { return a * x + b; }
std::function<double(double)> create_function(double a, double b) {
using std::placeholders::_1;
return std::bind(f, a, b, _1);
}
int main() {
auto func(create_function(1, 2));
std::cout << func(4) << std::endl;
return 0;
}

目标是使用给定的参数创建一次函数,以便它可以被另一个例程重复调用为 f(x(。真正的功能比这复杂得多,但我能够适应它。

如果您需要存储多个稍后调用的实现,请考虑将结果存储在std::function中(否则,由于每个 lambda 都有唯一的类型,您将无法存储该函数(。

我一直在看这篇文章,它会与此类似,但我不知道如何使其适应返回仍然依赖于 x 的函数。

auto create_function(double a, double b)
{
return [a, b](double x) { return a*x + b; };
}
client code:
std::function<double(double)> computation = create_function(3., 4.);
double y1 = computation(1.0);
double y2 = computation(2.0);
computation = another_lambda_implementation(/*arguments here*/);
double y3 = computation(2.0);