传递Python函数以增强C

Passing Python function to Boost C++

本文关键字:增强 函数 Python 传递      更新时间:2023-10-16

我正在尝试了解增强功能。我想将Python函数传递到使用Boost Python包装的C 模块。我遵循此处给出的示例,然后对其进行了修改,以接受采用输入参数并返回一些输出的函数。这是我的代码:

typedef double (op_t)(double);
boost::function<op_t> op;
double defaultOperator(double t) {
  return t;
}
void setOperator(boost::python::object obj) {
  op = obj;
}
double callOperator(double t) {
  return op(t);
}
BOOST_PYTHON_MODULE(op1) {
  op = &defaultOperator;
  def("setOperator", &setOperator);
  def("callOperator", &callOperator);
}

当我尝试编译此问题时,我会在setOperator函数中出现错误,说cannot convert ‘boost::python::api::object’ to ‘double’ in return。如果我用typedef void (op_t)(double);替换Typedef行并将callOperator更换以返回void,则代码有效。这使我能够传递可以在参数上运行但不会返回任何内容的Python函数。

我的代码中有什么问题?我应该如何纠正它传递返回值的Python函数?

经过大量搜索和一些试用&amp;错误,我设法修改了我的代码以使其有效。我必须为Boost Python对象创建一个包装结构,其中包括operator()方法,以便可以在分配给op变量之前将包装对象作为Boost函数施放为Boost函数。这是修改的代码:

struct op_wrapper_t {
  op_wrapper_t( object callable ) : _callable( callable ) {}
  double operator()(double t) {
    return extract<double>(_callable(t));
  }
  object _callable;
};
void setOperator(object obj) {
  op = boost::function<double (double)>( op_wrapper_t(obj) );
}

我遵循与本文中的类似程序。但是,我仍然不明白为什么返回无效的功能不需要这样的包装/铸造。