如何在pybind11中暴露C++类的重载构造函数给Python?
解决pybind11中C++重载构造函数的Python绑定问题
可以直接结合py::overload_cast与py::init实现需求,修改后的pybind11绑定代码如下:
PYBIND11_MODULE(ex_module, module_handle){ module_handle.doc() = "ex class"; py::class_<MyClass>(module_handle, "PyEx") .def(py::init(py::overload_cast<>(&MyClass::MyClass))) .def(py::init(py::overload_cast<const std::string&>(&MyClass::MyClass))) ; }
代码说明
py::overload_cast<>(&MyClass::MyClass)明确指定绑定无参构造函数,模板参数留空表示无参数。py::overload_cast<const std::string&>(&MyClass::MyClass)指定绑定带const std::string&参数的构造函数,用const引用是更高效的写法,直接写std::string作为模板参数也能达到同样效果。
Python端验证
重新编译模块后,在Python中即可正常使用两种实例化方式:
import ex_module # 调用无参构造函数 obj_empty = ex_module.PyEx() # 调用带字符串参数的构造函数 obj_named = ex_module.PyEx("blah")
之前调用带参构造未生效,本质是因为没有绑定对应的构造函数,Python端实际还是调用了无参构造版本,绑定上述代码后即可解决该问题。
内容的提问来源于stack exchange,提问作者sodiumnitrate
相关产品推荐
相关产品推荐

