C ++将函数作为参数传递

时间:2015-10-21 22:27:47

标签: c++ c++11 functional-programming

我需要在C ++中调用库函数,它的格式为:

double brents_fun(std::function <double(double)> f);

我可以通过以下方式调用此函数:

double fun1(double x)
{
   return -2.0*x+1;
}

void main()
{
   brents_fun(fun1);
   return 0;
}

我想将另一个函数传递给brents_fun,例如:

double fun2(double x, double y)
{
   return -2.0*x+y;
}

void main()
{
   y=12.0;
   brents_fun( fun2(x,y=12) );
   return 0;
}

在我的真实代码中,y很复杂。我需要从文件中读取数据,用数据进行一些计算以生成y。这就是我在fun2中需要两个参数x和y的原因。 y在调用brents_fun时不会更改。

由于y没有改变,有没有办法将fun2传递给brents_fun?

谢谢。

2 个答案:

答案 0 :(得分:3)

你基本上想要部分应用一个函数将它作为参数传递给brents_fun,这是可能的,你可以用两种方法在C ++ 11中做到这一点:

  • with lambda
  • std::bind

两种解决方案:

double brents_fun(std::function <double(double)> f)
{
  return f(0.0);
}

double fun1(double x, double y)
{
  return x+y;
}

int main() {
  double res1 = brents_fun([](double x) { return fun1(x, 12.0); });
  double res2 = brents_fun(std::bind(fun1, placeholders::_1, 12.0));
}

虽然lambda更适合优化,但两种解决方案都是等价的。 std::bind可以是多态的,而lambda则不能,但这不是你的情况。我只想坚持你喜欢的语法。

答案 1 :(得分:0)

brents_fun接受一个函数形式为:double someFunction(double),正如您可能已经知道的那样。不能使用其他返回类型的函数或参数。在这种特殊情况下,你可以传递fun1函数,当你计算它们时,它们会相加。另外,要发布格式化代码,只需选择它并按ctrl + k即可。