Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Python函数传递给Boost C++;_Python_C++_Boost_Function Pointers - Fatal编程技术网

将Python函数传递给Boost C++;

将Python函数传递给Boost C++;,python,c++,boost,function-pointers,Python,C++,Boost,Function Pointers,我正在努力学习Boost函数。我想把Python函数传递给使用PosithPython包装的C++模块。我按照给出的示例进行了修改,以接受接受输入参数并返回一些输出的函数。这是我的密码: typedef double (op_t)(double); boost::function<op_t> op; double defaultOperator(double t) { return t; } void setOperator(boost::python::object obj

我正在努力学习Boost函数。我想把Python函数传递给使用PosithPython包装的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);
}
typedef-double(操作)(双);
boost::函数op;
双默认运算符(双t){
返回t;
}
void setOperator(boost::python::objectobj){
op=obj;
}
双调用运算符(双t){
返回op(t);
}
BOOST_PYTHON_模块(op1){
op=&defaultOperator;
def(“设置操作员”、&setOperator);
def(“callOperator”、&callOperator);
}
当我试图编译它时,我在我的
setOperator
函数中得到一个错误,它说
不能将'boost::python::api::object'转换为'double'作为返回值
。如果我用
typedef void(op_t)(double)替换typedef行,代码就会工作
并更改
callOperator
以返回void。这允许我传递可以对参数进行操作但不返回任何内容的Python函数


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

经过大量的搜索和尝试,我成功地修改了代码,使其正常工作。我必须为boostpython对象创建一个包装器结构,其中包括一个
操作符()
方法,这样包装的对象就可以在分配给
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) );
}
struct op\u wrapper\t{
op_包装器_t(可调用对象):_可调用(可调用){
双运算符()(双t){
返回摘录(_callable(t));
}
对象可调用;
};
无效设置运算符(对象对象对象){
op=boost::函数(op_包装器(obj));
}
我遵循了一个类似于中的程序。然而,我仍然不明白为什么返回void的函数不需要这样的包装器/转换