c++ - PyBind11:在 Python 中访问唯一的指针属性

标签 c++ pybind11

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

class OuterClass {
public:
   std::unique_ptr<InnerClass> obj;
}

class InnerClass {
public:
    void method();
}
和 pybind11 绑定(bind):
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()
unique ptr 的文档似乎并不认为这应该是一个问题,因为他们给出了一个返回唯一 ptr 的函数的示例。试图访问唯一的 ptr 属性是问题吗?我怎样才能解决这个问题?

最佳答案

使用def_property使用 lambda 返回指针:

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);
}

关于c++ - PyBind11:在 Python 中访问唯一的指针属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62944294/

相关文章:

cmake - 同名的 Python 库和 CMake 目标

python - 通过 pybind11 使用 google/draco 作为 lib 构建

c++ - 这是否使用与此 typedef 相同的函数类型(不是指针)的别名

C++。 Child 继承自 Parent 并作为 Parent 属性包含在内

c++ - 如何让简单的一个函数读取我之前的答案并给出不同的输出? (c++)

multiple-inheritance - pybind11,使用 std::enable_shared_from_this 绑定(bind) Trampolines 和多重继承时编译失败

c++异构容器,获取条目作为类型

c++ - 这就是 C++ 11 中的移动构造函数有意义的原因吗?

python - pybind11:使用设置工具链接

c++ - 消除非常量和常量访问方法的歧义 (Pybind11)