繁体   English   中英

将Python函数传递给Boost C ++

[英]Passing Python function to Boost C++

我正在尝试了解Boost功能。 我想将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函数中得到一个错误, setOperator函数表示cannot convert 'boost::python::api::object' to 'double' in return 如果我用typedef void (op_t)(double);替换typedef行,代码就可以工作typedef void (op_t)(double); 并更改callOperator以返回void。 这允许我传递可以对参数进行操作但不返回任何内容的Python函数。

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

经过大量的搜索和一些试验和错误,我设法修改我的代码,使其工作。 我必须为Boost Python对象创建一个包装结构,其中包含一个operator()方法,以便在将赋值对象分配给op变量之前将其作为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) );
}

我遵循了类似的过程作为一个在这个岗位 但是,我仍然不明白为什么返回void的函数不需要这样的包装/转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM