我的数学函数f(x,p)
取决于参数x
和参数p
。我想为p ( void *)
动态分配内存,并在参数值被馈送g(x)
后返回函数f
。我如何在C ++中实现它?
更具体地说,这是我希望实现的使用场景:
double x;
p1 = new double[2];
p2 = new double[2];
g1 = f(p1)
g2 = f(p2)
g1(x);
g2(x);
g1(x)
和g2(x)
分别是计算f(x,p1)
和f(x,p2)
的函数。
谢谢。
答案 0 :(得分:2)
在C ++ 11中,您可以使用lambda来实现此目的:
double x;
auto p1 = new double[2];
auto p2 = new double[2];
auto g1 = [p1](double d){return f(d,p1)};
auto g2 = [p2](double d){return f(d,p2)};
g1(x);
g2(x);
答案 1 :(得分:2)
您所要求的是将第一个参数(p1)“绑定”到函数(f)并为第二个参数(x)设置“占位符”。将其直接翻译成C ++ 11中的代码,我们可以使用std::bind
:
auto g1 = std::bind(f, p1, std::placeholders::_1);
g1(x); // calls f(p1, x);
bind
的返回类型未指定,但如果您需要将g1
存储在某处,则可以将其存储为std::function<void(double)>
。
或者你可以使用C ++ 14并编写一个通用的双参数currier:
template <typename F, typename Arg>
auto curry(F f, Arg arg) {
return [f,arg](auto arg2) {
return f(arg, arg2);
};
}
auto g1 = curry(f, p1);
g1(x);
答案 2 :(得分:2)
您可以使用std::function
,使用lambda初始化
#include <functional>
std::function<void (double)> f(double *p)
{
return [&](double x) {
// whatever
};
}
int main()
{
double *p = new double[2];
auto g = f(p);
g(2);
}
答案 3 :(得分:0)
您的方法存在一些概念性问题:
由于g1(x)= f(x,p1)和g2(x)= f(x,p2),所以你需要的只是f(x,p1)和f(x,p2) ;
double x;
p1 = new double[2];
p2 = new double[2];
f(x,p1);
f(x,p2);
答案 4 :(得分:0)
您可以使用std::bind
#include <iostream>
#include <functional>
void f(double x, double p[2])
{
std::cout << x << " " << p[0] << " " << p[1] << std::endl;
}
int main() {
double x = 5;
auto p1 = new double[2];
p1[0] = p1[1] = 10;
auto p2 = new double[2];
p2[0] = p2[1] = 20;
auto g1 = std::bind(f, std::placeholders::_1, p1);
auto g2 = std::bind(f, std::placeholders::_1, p2);
g1(x);
g2(x);
}