我正在使用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
//-------------------
?
拜托,有人可以给我一些小费吗?
答案 0 :(得分:1)
您很可能错过了几个需要标头才能使其正常工作,#include <pybind11/functional.h>
(对于std::function
支持)和#include <pybind11/stl.h>
(对于stl容器支持);默认情况下不包含标题(以保持核心项目更小)。
有了这些,你的例子几乎可以工作(它只需要const
添加到std::function
的内部参数,即const std::function<double(const double *)> &func
:std::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