【问题标题】:Passing Python function to Boost C++将 Python 函数传递给 Boost C++
【发布时间】:2014-02-22 11:35:09
【问题描述】:

我正在尝试了解 Boost 功能。我想将 Python 函数传递给使用 Boost Python 包装的 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);
}

当我尝试编译它时,我的setOperator 函数中出现错误,显示cannot convert ‘boost::python::api::object’ to ‘double’ in return。如果我将 typedef 行替换为 typedef void (op_t)(double); 并将 callOperator 更改为返回 void,则该代码有效。这允许我传递可以对参数进行操作但不返回任何内容的 Python 函数。

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

【问题讨论】:

    标签: python c++ boost function-pointers


    【解决方案1】:

    经过大量搜索和反复试验,我设法修改了我的代码以使其正常工作。我必须为 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 的函数不需要这样的包装器/强制转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      相关资源
      最近更新 更多