返回带有评估参数的函数

时间:2018-08-20 08:01:55

标签: c++

我对C ++相当陌生,我想做以下事情,但不知道如何做。

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

我想定义一个函数create_function(double a, double b),该函数将返回a*x+b并返回ab的参数值,以便我可以使用另一个函数{{ 1}}对其进行评估。

目标是仅使用给定参数创建一次函数,以便随后可以像func( double x )一样被另一个例程重复调用。真正的功能要比这复杂得多,但我可以对其进行调整。

我一直在看这个post,它与此类似,但是我不知道如何使它适应返回仍依赖于f(x)的函数。

4 个答案:

答案 0 :(得分:11)

您可以使用lambda做到这一点:

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
}

Demo(表明编译器已经知道func(4.0)将始终返回11)

答案 1 :(得分:3)

您可以为此使用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函数只是创建函数对象的一种[更方便的方式]。

答案 2 :(得分:2)

您可以使用std::bind

DF <- data.frame(x = 1:3, y = 1:3)

library(ggplot2)
set.seed(42)
ggplot(DF, aes(x, y)) +
  geom_point(position = position_jitter(width=.4)) +
  scale_y_continuous(limits = c(0, 3))

set.seed(1)
ggplot(DF, aes(x, y)) +
  geom_point(position = position_jitter(width=.4)) +
  scale_y_continuous(limits = c(0, 3))
#Warning message:
#Removed 1 rows containing missing values (geom_point).

答案 3 :(得分:2)

  

目标是仅使用给定参数创建一次函数,以便随后可以由另一个例程像f(x)一样反复调用它。真正的功能要比这复杂得多,但我可以对其进行调整。

如果需要存储多个实现以供稍后调用,请考虑将结果存储在std::function中(否则,因为每个lambda都有唯一的类型,将无法存储该函数)。 / p>

  

我一直在看这篇文章,可能与此类似,但是我不知道如何使它适应返回仍然依赖于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);