我可以在pybind11中从C++端重载init吗?

x8diyxa7  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(104)

如果在C++中,一个类有一个重载的构造函数:

class MyClass {
    std::string name;
public:
    MyClass(){};
    MyClass(std::string name_){ name = name_;}
};

如何将其暴露给Python?我可以同时使用py::overload_castpy::init吗?
目前我揭露第一个:

PYBIND11_MODULE(ex_module, module_handle){
    module_handle.doc() = "ex class";

    py::class_<MyClass>(module_handle, "PyEx")
        .def(py::init<>())
        ;
}

(Note我使用的是C++20和Python>=3.10)
我希望能够做到:

new_obj = PyEx()
new_obj = PyEx("blah")

目前,PyEx("blah")没有抛出任何错误,但它也没有真正将blah传递到C++构造函数中。我通过在第二个构造函数中添加一个print语句来检查这一点。

**编辑:**简化了问题。

v7pvogib

v7pvogib1#

不需要使用任何overload_cast技巧,因为公开构造函数与公开传递指向成员函数的指针的方法不同。你只需要在默认构造函数之后(或之前)定义你的单参数构造函数:

py::class_<MyClass>(module_handle, "PyEx")
        .def(py::init<>())
        .def(py::init<std::string>())
        ;

相关问题