我对C ++相当陌生,我想做以下事情,但不知道如何做。
我想基于带有一些参数的模板定义函数。假设我们有f(x)=a*x+b
,但是参数a
和b
将作为参数传递。
我想定义一个函数create_function(double a, double b)
,该函数将返回a*x+b
并返回a
和b
的参数值,以便我可以使用另一个函数{{ 1}}对其进行评估。
目标是仅使用给定参数创建一次函数,以便随后可以像func( double x )
一样被另一个例程重复调用。真正的功能要比这复杂得多,但我可以对其进行调整。
我一直在看这个post,它与此类似,但是我不知道如何使它适应返回仍依赖于f(x)
的函数。
答案 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);