Рассмотрим следующие три функции:
using phase_t = Eigen::VectorXd;
using rhs_t = phase_t (*)(double const &, phase_t const &);
using step_t = phase_t (*)(rhs_t , phase_t const &, double, double);
Eigen::MatrixXd foo_ee_step(rhs_t rhs, phase_t const &z0);
Eigen::MatrixXd foo_int(step_t step, rhs_t rhs, phase_t const & z0);
Eigen::MatrixXd foo_ee(rhs_t rhs, phase_t const &z0);
Все они имеют один аргумент типа rhs_t
, который я указал во второй строке выше. Кроме того, одна из функций имеет параметр типа step_t
, который зависит от параметра типа rhs_t
. Моя проблема в том, что переменная, которую я хотел бы передать foo_ee_step
, foo_int
и foo_ee
, имеет значение от
phase_t my_rhs(double const &, phase_t const &, double);
, поскольку я не могу изменить foo_ee_step
, foo_int
и foo_ee
Я пытался использовать лямбду, чтобы переопределить функцию подходящим способом
Eigen::MatrixXd some_function(.....):
auto better_rhs = [&c](double const & a, phase_t const & b){return my_rhs(a,b,c);};
return foo_ee(better_rhs, m);
, но это приводит к
error: cannot convert ‘some_function(....)::<lambda(const double&, const phase_t&)>’ to ‘rhs_t’ {aka ‘Eigen::Matrix<double, -1, 1> (*)(const double&, const Eigen::Matrix<double, -1, 1>&)’}
Я думаю, что это происходит из-за того, что я пытаюсь передать лямбда, которая захватывает что-то в виде указателя на функцию, которая, кажется, запрещена ... Я прочитал здесь , что можно попытаться решить эту проблему, определив функтор. Но если я не ошибаюсь, чтобы это работало, мне нужно изменить foo_ee_step
, foo_int
и foo_ee
, чего я не могу .. Так, я действительно не знаю, как решить эту проблему. Можно ли как-нибудь привести это лямбда-выражение в форму rhs_t
? Существуют ли другие методы для решения этой проблемы?
PS Не уверен, что это важно, но до сих пор я также пытался:
- Определение еще одной функции внутри
some_function
, которая называется better_rhs
(которая, очевидно, также не не работает). - Оберните все это в класс и используйте
foo_ee_step
, et c. как функции-члены. Затем просто определите другую функцию-член better_rhs
и вызовите ее my_rhs
.. Это привело к ошибке из-за невозможности передать функцию-член c, не относящуюся к состоянию, но из-за необходимости вызывать ее явно ...
Любые советы о том, как действовать, приветствуются.