如何使用 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 & python 中为没有默认构造函数的 std::pair<> 创建接口?
SWIG TCL:将类构造函数名称从 new_* 重命名为 create_*