给出参数后返回一个函数

时间:2015-07-21 14:52:51

标签: c++

我的数学函数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)的函数。 谢谢。

5 个答案:

答案 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)

您的方法存在一些概念性问题:

  1. 你可以从一个函数返回一个函数指针(这是你在这里想要做的描述:g1 = f(p1)),但我认为这样做太过分了。
  2. 由于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);
}