如何在pybind11中将python函数转换/转换为std :: function <double(double *)>?

时间:2017-08-02 11:13:58

标签: python c++11 pybind11

我正在使用pybind11为我的c ++项目实现绑定。 所以,我的问题基本上是如何在解释器中定义python函数 并从C ++代码中调用它。 C ++接口使用指针(double *)传递数据,我不知道如何在解释器中编写函数代码以及如何将其转换为std :: function来执行评估:

// C++
//--------
double cpp_call( const std::array<double,N> &value, const std::function<double(double*)> &func) 
{
    return func(value.data());
}

// python binding with pybind11
// module definition... 
 ...
 m.def("py_call", &cpp_call);

//python interpreter 
//-------------------

?

拜托,有人可以给我一些小费吗?

1 个答案:

答案 0 :(得分:1)

您很可能错过了几个需要标头才能使其正常工作,#include <pybind11/functional.h>(对于std::function支持)和#include <pybind11/stl.h>(对于stl容器支持);默认情况下不包含标题(以保持核心项目更小)。

有了这些,你的例子几乎可以工作(它只需要const添加到std::function的内部参数,即const std::function<double(const double *)> &funcstd::array是const,因此它的.data()返回一个const指针。)

以下是显示此工作的完整示例:

#include <pybind11/pybind11.h>
#include <pybind11/functional.h>
#include <pybind11/stl.h>

double cpp_call(const std::array<double, 3> &values,
                const std::function<double(double *)> &func) {
    double ret = 0;
    for (auto d : values) ret += func(&d);
    return ret;
}

PYBIND11_MODULE(stack92, m) {
    m.def("sum", &cpp_call);
}

的Python:

>>> import stack92
>>> def f(v): return v**.5
... 
>>> print("1+2+3 =", stack92.sum([1, 4, 9], f))
1+2+3 = 6.0