【发布时间】:2020-01-28 07:29:35
【问题描述】:
考虑以下三个函数:
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,我尝试使用 lambda 以合适的方式重新定义函数
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>&)’}
我认为这是因为我试图传递一个捕获某些东西作为函数指针的 lambda,这似乎是 forbidden...我读过 here,可以尝试通过定义函子来解决这个问题。但如果我没记错的话,我需要更改foo_ee_step、foo_int 和foo_ee,但我不能……所以,我真的不知道如何解决这个问题。 . 是否有可能以某种方式将此 lambda 表达式转换为rhs_t 的形式?有没有其他技术可以解决这个问题?
附:不确定它是否重要,但到目前为止我也尝试过:
- 在
some_function中定义另一个名为better_rhs的函数(显然也没有工作)。 - 将所有这些包装到一个类中,并使用
foo_ee_step等作为成员函数。然后只需定义另一个成员函数better_rhs并在那里调用my_rhs.. 这导致无法传递非静态成员函数但必须显式调用它的错误......
感谢任何有关如何进行的提示。
【问题讨论】: