Как использовать boost :: bind для создания оболочки функций - PullRequest
0 голосов
/ 25 февраля 2012

Я хочу использовать 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 Ответ

2 голосов
/ 25 февраля 2012

Зачем добавлять (x)?

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

Это уже определяет оболочку f, второй аргумент которой равен 2, и вы можете вызвать

cb(x0)

чтобы получить f(x0, 2).

...