"传递Python函数给Boost C++"

2024-10-01 15:33:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习Boost函数。我想把Python函数传递给使用PosithPython包装的C++模块。我遵循给定的here示例并对其进行了修改,以接受接受接受输入参数并返回某些输出的函数。我的代码是:

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);
}

{{cdi>在这个函数中,{I}表示编译错误。如果我用typedef void (op_t)(double);替换typedef行,并将callOperator改为返回void,代码就可以工作。这使我可以传递可以对参数进行操作但不返回任何内容的Python函数。在

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


Tags: 函数代码obj参数returndefdoubleboost
1条回答
网友
1楼 · 发布于 2024-10-01 15:33:46

经过大量的搜索和一些尝试和错误之后,我设法修改了我的代码,使其正常工作。我必须为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) );
}

我遵循了与this post中类似的过程。但是,我仍然不明白为什么返回void的函数不需要这样的包装器/强制转换。在

相关问题 更多 >

    热门问题