2017-08-02 52 views
1

我正在使用pybind11来实现我的c + +项目的绑定。 所以,我的问题基本上是如何在解释器 中定义python函数并从C++代码中调用它。 的C++接口会使用指针(双*)的数据,我不知道如何在解释器代码的功能,以及如何将其转换为一个std ::功能进行评价:如何在pybind11中将python函数转换为std :: function <double(double *)>?

// 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

你最有可能缺少一些需要标题来获得此工作,#include <pybind11/functional.h>(支持std::function)和#include <pybind11/stl.h>(用于stl容器支持);默认情况下不包括头部(以保持核心项目更小)。

有了这些,你的例子几乎工作(它只需要一个const加到std::function的内论点,即const std::function<double(const double *)> &func:所述std::array是常量,因此,其.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 
+0

谢谢!这样可行 –

相关问题