【发布时间】:2022-07-06 06:05:16
【问题描述】:
typedef bool (*ftype_callback)(ClientInterface* client, const Member* member ,int member_num);
struct Member{
char x[64];
int y;
};
class ClientInterface {
public:
virtual int calc()=0;
virtual bool join()=0;
virtual bool set_callback(ftype_callback on_member_join)=0;
};
它来自 SDK,我可以在 c++ 代码中从动态库中调用client。
bool cb(ClientInterface* client, const Member* member ,int member_num) {
// do something
}
cli->set_callback(cb);
cli->join();
我想将它移植到 python 绑定使用 pybind11。我如何在 python 中set_callback?
我已经看到doc 并尝试:
PYBIND11_MODULE(xxx, m) {
m.def("set_callback", [](xxx &self, py::function cb ){
self.set_callback(cb);
});
}
代码编译失败。
我的问题,我如何将py::function 转换为ftype_callback 或者有其他方法可以做到吗?
【问题讨论】:
-
你从哪里得到
cb?您是在 C++ 代码中还是在 Python 代码中定义它? -
@Nimrod 示例代码是用 C++ 定义的。我想在 Python 中定义
callback function和在 Python 中定义set_callback以便 SDK 将调用 Python 代码中的回调函数。 -
你见过doc吗?有用吗?
-
描述已更新。
-
不确定你想要什么是直接可能的。 list of builtin conversions 不包括函数指针。它包括
std::function,它更加灵活。如果您可以更改 C++ 代码,请考虑将ftype_callback更改为using ftype_callback = std::function<bool(ClientInterface*,const Member*,int)>;并在 lambda 参数中使用ftype_callback&,类似于您链接到的文档中的func_arg示例。