python - 如何使用pybind11将堆分配指针的`std::vector`传递给python?
问题描述
假设我现在有一堆指针foo*
,我想std::vector
在 c++ 函数中使用它们将它们传递给 python get_foos
,但我想在 c++ 中管理向量中那些堆分配指针的生命周期,即 python 应该只释放向量但不是当 c++ 向量foos
超出 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;
}
解决方案
您必须包含一个辅助标头<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);
}
推荐阅读
- c - 我用 C 做了一个计算器,但我想修复一些关于 scanf 的错误
- ios - dyld:找不到符号:Xcode 11 崩溃
- python - 使用 cdparanoia 在 Python 中没有关于音频 cdrom 的输出信息
- javascript - 自定义光标问题
- angular - 创建单独的文件进行验证,以便我可以在不同的组件中使用它
- python - 使用 f-string 函数处理复杂字符串
- javascript - 塔防方向变化
- azure - 为 Power BI 容量挂起获取 Azure oauth 令牌
- google-bigquery - BigQuery 问题 - 使用路径表进行归因建模
- laravel - Doctrine Serializer:使用组的问题