如何使用 swig 修改类构造函数以保持对构造函数参数之一的引用?

Posted

技术标签:

【中文标题】如何使用 swig 修改类构造函数以保持对构造函数参数之一的引用?【英文标题】:How to use swig to modify class constructor to keep a reference to one of the constructor arguments? 【发布时间】:2020-01-27 20:41:16 【问题描述】:

假设我有一个 C++ 类 MyArray(void* data, width, height),我想用 SWIG 将它包装到 Python。现在我有一个类型映射,它将一个 numpy 数组映射到数据、宽度和高度,我想保留一个 MyArray 对象而不复制,即使 numpy 数组超出范围。

如何覆盖/隐藏 MyArray 的构造函数,以存储对 numpy 数组的引用,以便 MyArray 保持 numpy 数组的引用计数?

【问题讨论】:

【参考方案1】:

对不起,我的 Java 解决方案,但我确信转换为 Python 案例没有问题。我的解决方案基于其他答案Prevent premature garbage collection。在这种方法中,引用存储在高级语言包装器中的对象(在您的情况下为 Python)。为此,您可以使用 *.i 文件中的下一个代码(Java 案例示例):

%define SAVE_REF(container, variable)
%typemap(javacode) container %
  private Object ref_ ## variable;
%

%typemap(javaconstruct) container 
    ref_ ## variable = variable;
    swigCPtr = $imcall;
    swigCMemOwn = true;

%enddef

然后在*.i中的类型声明之前

SAVE_REF(my_awesome_container_t, element);

... type declaration ...

【讨论】:

以上是关于如何使用 swig 修改类构造函数以保持对构造函数参数之一的引用?的主要内容,如果未能解决你的问题,请参考以下文章

SWIG:无法使用双指针访问构造函数

如何在 swig & python 中为没有默认构造函数的 std::pair<> 创建接口?

SWIG TCL:将类构造函数名称从 new_* 重命名为 create_*

SWIG 多参数类型映射适用于函数,但如果有多个构造函数,则不适用于构造函数

没有默认构造函数的对象成员的 Swig setter

Python 错误:在 SWIG 生成的 C++ 模板代码模块中未定义构造函数