假设我现在有一堆指针foo*,我想在c++函数get_foos中使用std::vector将它们传递给python,但我想在c++中的向量中管理这些堆分配的指针的生命周期,也就是说,当c++向量foos超出python的作用域时,python应该只释放向量,而不释放这些指针。
return_value_policy::reference似乎还不够,因为它也不会破坏向量,如果我错了,请纠正我。
struct foo {};
py::class_<foo>(m, "Foo");
auto get_foos() -> std::vector<foo*> {
auto foos = std::vector<foo*> {};
for(...) {
auto p = get_foo_ptr(...);
foos.emplace_back(p);
}
return foos;
}发布于 2020-07-25 03:44:28
有一个帮助器标头,您必须包含<pybind11/stl.h>。
下面是一个例子:
struct Foo {
Foo(const char *name) : m_name(name) {}
~Foo() {}
const char *get_name() const { return m_name.c_str(); }
private:
string m_name;
};
vector<unique_ptr<Foo>> make_foos() {
vector<unique_ptr<Foo>> foos;
foos.push_back(make_unique<Foo>("Hello"));
foos.push_back(make_unique<Foo>("World"));
return foos;
}
vector<Foo *> get_foos() {
static vector<unique_ptr<Foo>> all_foos = make_foos();
vector<Foo *> foos;
for (unique_ptr<Foo> &foo : all_foos) {
foos.push_back(foo.get());
}
return foos;
}
PYBIND11_MODULE(example, m) {
py::class_<Foo>(m, "Foo")
.def("get_name", &Foo::get_name);
m.def("get_foos", get_foos, py::return_value_policy::reference);
}https://stackoverflow.com/questions/63047691
复制相似问题