Мне нужно вызвать библиотечную функцию на 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. Вот почему мне нужны два аргумента x и y в fun2. y не изменится во время вызова brents_fun.

Поскольку y не изменяется, есть ли способ передать fun2 в brents_fun?

Спасибо.

Хао

1
Hao Shi 22 Окт 2015 в 01:27

2 ответа

Лучший ответ

По сути, вы хотите частично применить функцию, чтобы передать ее в качестве аргумента для brents_fun, это возможно, и у вас есть два способа сделать это в C ++ 11:

  • с лямбдой
  • с 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));
}

Хотя лямбда больше подходит для оптимизации, оба решения эквивалентны. std::bind может быть полиморфным, а лямбда - нет, но в вашей ситуации это не так. Я бы сказал, просто придерживайтесь того синтаксиса, который вам больше нравится.

3
Jack 21 Окт 2015 в 22:38

Brents_fun принимает в качестве аргумента функцию в форме: double someFunction (double), как вы, возможно, уже знаете. Никакие функции с другими возвращаемыми типами или аргументы не могут использоваться. В этом конкретном случае вы можете передать функцию fun1, они суммируют y, когда вы ее вычислили. Кроме того, чтобы опубликовать отформатированный код, просто выберите его и нажмите ctrl + k.

0
Henri 21 Окт 2015 в 22:38