如何使用boost :: bind创建一个函数包装器

时间:2012-02-25 09:23:28

标签: c++ boost bind

我想使用boost :: bind(我不确定它是否真的是我的问题的正确解决方案)来创建一个包含一个或两个参数的函数的包装器,而包装器只接受一个参数将另一个修复为某个常量值。我的功能看起来像

double f(double a, double b)
{
  return a/b;
}

double g(double b)
{
  return 2*b; // b+b?
}

在我的代码中,我有一个带有一个参数的函数的typedef:

typedef boost::function<double (double)> callback;

我的想法是用这个创建函数包装器:

callback cb;
cb = boost::bind(f, _1, 2)(x);

这样我就可以调用使用在参数中传递的包装函数的第三个函数:

double use(callback cb, double x, double y)
{
  return cb(x0) - y0;
}

我有大约30个带有一个或两个参数的函数,第一个或第二个必须是常量。 use()不知道此常量,但use中实现的算法适用于每个函数。

当我尝试编译代码时,我遇到了行cb = boost::bind(f, _1, 2)(x);的错误:

'* f' cannot be used as a function

当我尝试直接使用绑定时,就像在cout << boost::bind(f, _1, 2)(x);中一样,我没有收到错误。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

为什么要添加(x)

cb = boost::bind(f, _1, 2);

这已经定义了f的包装器,第二个参数是2,你可以调用

cb(x0)

获取f(x0, 2)