【问题标题】:C++ pass a function as argumentC++ 将函数作为参数传递
【发布时间】:2016-01-21 02:25:27
【问题描述】:

我需要在 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?

谢谢。

【问题讨论】:

  • 所有的粗体和双倍行距是怎么回事?粘贴正确缩进的代码,标记它,然后使用 Ctl-k 将其格式化为代码。
  • 帮助阅读:isocpp.org/wiki/faq/pointers-to-members 主要是关于指向类成员的指针,但也涵盖标准函数案例并提供 C++ 友好的替代方案。
  • 感谢您的所有帮助。我为糟糕的格式道歉。

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


【解决方案1】:

您基本上希望部分应用一个函数以将其作为参数传递给brents_fun,这是可能的,您在 C++11 中有两种方法:

  • 带有 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 不能,但这不是您的情况的重点。我会说坚持你喜欢的语法。

【讨论】:

  • 谢谢杰克。两种解决方案都可以正常工作。也感谢您编辑我的帖子。 :-)
【解决方案2】:

brents_fun 接受以下形式的函数作为参数:double someFunction(double),您可能已经知道了。不能使用其他返回类型的函数,也不能使用参数。在这种特殊情况下,您可以传递 fun1 函数,它们在计算时求和 y。此外,要发布格式化代码,只需选择它并按 ctrl+k。

【讨论】:

  • 谢谢伊夫。下次我会用 ctrl+k 发布格式化代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 2016-04-21
  • 2013-08-25
相关资源
最近更新 更多