gpt4 book ai didi

c++ - Pybind11 访问不透明 vector 的不透明 vector

转载 作者:行者123 更新时间:2023-12-01 14:44:24 25 4
gpt4 key购买 nike

为了能够在 Python 和 C++ 之间通过引用传递自定义类型的 vector ,我的项目使用 PYBIND11_MAKE_OPAQUEpybind11::bind_vector<>在我的类型的 vector 上。 但是,我还需要使用自定义类型的 vector 。下面是一个例子。

#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <pybind11/stl_bind.h>
#include <vector>

class Example {};

PYBIND11_MAKE_OPAQUE(std::vector<Example>);
PYBIND11_MAKE_OPAQUE(std::vector<std::vector<Example>>);

PYBIND11_MODULE(ExModule, m)
{
pybind11::class_<Example>(m, "Example")
.def(pybind11::init<>());

pybind11::bind_vector<std::vector<Example>>(m, "ExampleVector");
pybind11::bind_vector<std::vector<std::vector<Example>>>(m, "Example2DVector");
}

如果我在 Python 中创建我的类型的二维 vector ,然后尝试访问它,我会收到错误消息。下面是示例 Python 代码。

from ExModule import Example, ExampleVector, Example2DVector

# a is a 10x10 vector of Examples
a = Example2DVector([ExampleVector([Example() for i in range(10)]) for i in range(10)])

b = a[4]

错误信息:

TypeError: Unable to convert function return value to a Python type! The signature was
(self: ExModule.Example2DVector, arg0: int) -> std::vector<Example, std::allocator<Example> >

这似乎是因为对二维 vector 类型的索引操作的返回类型是不透明类型。我认为应该发生的是返回应该构造成 ExampleVector .我不能从 Python 中做到这一点,它必须在模块包装器中完成。这是错误还是缺少功能?如果不是,我如何在 Example2DVector 上重载索引运算符?类(class)?

最佳答案

示例有效,但我的代码没有。这是因为在我的代码中,一维 vector 类绑定(bind)到 不同 pybind11 模块中的 Python 类型。因此,当为二维 vector 类定义 __getitem__ 时,一维 vector C++ 类型没有映射的 Python 类型。但是,我认为如果我稍后导入包含 1D vector Python 类型绑定(bind)的模块,它应该 可以工作,但事实并非如此。这可能是一个错误。

编辑:

这种行为不是错误(我想,Jakob 看起来是个很聪明的人)。正如在 manual 中讨论的那样关于绑定(bind) STL 容器,有一节是关于“模块本地”绑定(bind)的。默认情况下,类型绑定(bind)在定义它们的模块中是本地的,以避免同一类型的多个不同绑定(bind)。

但是,我们的项目包含一个“数据类型”模块,以及许多使用这些类型的模块。在这种情况下,我们不希望“数据类型”模块中定义的数据类型是模块本地的。否则,我们最终会遇到返回值未转换为正确的 Python 类型的给定问题。

我们可以在绑定(bind)定义中关闭默认的模块本地绑定(bind)。使用问题的示例,我们可以关闭 ExampleVector 的模块本地绑定(bind),并且访问 Example2DVector(在另一个模块中定义)将不再失败。

pybind11::bind_vector<std::vector<Example>>(m, "ExampleVector", pybind11::module_local(false));

关于c++ - Pybind11 访问不透明 vector 的不透明 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56811833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com