PyBind11:访问Python中的唯一指针属性



我有一个c++类,它有一个指向对象的唯一指针作为属性。我希望能够在Python中访问该属性,这样我就可以调用它的类方法。以下是我的设置示例:

class OuterClass {
public:
std::unique_ptr<InnerClass> obj;
}
class InnerClass {
public:
void method();
}

以及pybind11绑定:

PYBIND11_MODULE(example, m) {
py::class_<InnerClass>(m, "InnerClass")
.def("method", &InnerClass::method);
py::class_<OuterClass>(m, "OuterClass")
.def_readonly("obj", &OuterClass::obj);
}

但是,这无法编译,出现错误error: no matching function for call to ‘pybind11::cpp_function::cpp_function(std::unique_ptr<InnerClass> OuterClass::*, pybind11::name, pybind11::is_method, pybind11::sibling)

我希望能够在python中做到这一点:

outer_obj.obj.method()

唯一ptr的文档似乎并不认为这应该是一个问题,因为他们给出了一个返回唯一ptr函数的例子。尝试访问唯一的ptr属性是问题所在吗?我该怎么绕过这个?

使用带lambda的def_property返回指针:

class InnerClass {
public:
void method()
{
std::cout << "OK" << std::endl;
}
};
class OuterClass {
public:
OuterClass()
: obj(std::make_unique<InnerClass>())
{
}
std::unique_ptr<InnerClass> obj;
};

PYBIND11_MODULE(example, m) {
py::class_<InnerClass>(m, "InnerClass")
.def("method", &InnerClass::method);
py::class_<OuterClass>(m, "OuterClass", py::dynamic_attr())
.def(py::init<>())
.def_property_readonly("obj", [](const OuterClass& o){return o.obj.get();}, py::return_value_policy::reference_internal);
}

最新更新