2017-08-02 140 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

謝謝!這樣可行 –

相關問題