[英]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.